5/9eddlmZddlmZddlmZddlZddlZddlZddlZddl Z ddl m Z m Z m Z ddlmZmZddlmZddlmZdd lmZmZmZmZddlZd ZGd d eZd ZGdde Z!Gdde!Z"Gdde!Z#GddeZ$Gdde!Z%Gdde!Z&Gdde!Z'Gdde!Z(Gdde!Z)dS) )print_function)absolute_import)rangeN)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_NAMErCpanelrrr r!Unknownrrrdetect_panelclassr''s  ~  ww 8 # #xx ; & &{{ < ' '|| = ( (}} ; & &{{yyrceZdZdZddZdZdZedZ dd Z ed Z edd Z dd Z ddZ ddZddZddZddZddZddZddZddZddZdS) GeneralPanelcNt|_|jj|_t j|_|j|jkr-td |j|jd|_ dS)Nz+Class "{}" not should be used on panel "{}") r users_data __class__r class_namer"r#current_panel_namelower UserWarningformat cpapi_plugin)selfs r__init__zGeneralPanel.__init__;s''.1"("2"4"4 ? " "d&=&C&C&E&E E EKRR' !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 )r2adminsr3debugs r list_adminszGeneralPanel.list_adminsGs  '')))rc6|j|S)z| Return True if username is in admin names :param str username: user to check :return: bool )r2is_admin)r3usernames rr;zGeneralPanel.is_adminOs  ))(333rcl|r1tj|d|jjddSdS)Nz is not implemented for  )sysstderrwriter,rr3r8 method_names r_warningzGeneralPanel._warningWsQ  7 J   T^4446 7 7 7 7 7 7 7rcjtjtjd|dS)NzCL_CONTROLLIB: {})syslog LOG_WARNINGr1)msgs r _slog_warningzGeneralPanel._slog_warning\s, f(*=*D*DS*I*IJJJJJrNTcz||td||td|s |j|S#tj$rF}|rt ||r(|d|Yd}~dSd}~wwxYw |jt|dS#tj$rF}|rt ||r(|d|Yd}~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 specifiedz4User with username="{}" is not present in the systemrz/User with uid="{}" is not present in the systemIncorrect user id) ValueErrorr+get_uidr NoSuchUserExceptionprintrIr1 get_namesint)r3uidr<r8syslog_es r_check_and_get_userz GeneralPanel._check_and_get_user`s ?x3;<< < ;8+OPP P   ..x888,   !HHH+&&N))+++ttttt  ?,,SXX66q9 9(    a """EVC[["""44444    % & & &44 s5AB;BB,C D:;DD:9D:c~t|d5}|}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 rN)open readlines) file_namefcontents rget_file_lineszGeneralPanel.get_file_linessx)S ! ! $QkkmmG $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s 266wct||5}||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 N)rY writelines)r[r] open_methodr\s rwrite_file_lineszGeneralPanel.write_file_liness)[ ) ) "Q LL ! ! ! " " " " " " " " " " " " " " " " " "s 488c2||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 allNrDr7s 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)r3packager8s 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)r3rhresellerr8s 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 packageNrer3rRr8s 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 packagesNrer7s 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 resellersNrer7s 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 resellerNrer3rkr8s 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 usersNrer7s r list_userszGeneralPanel.list_userss e\*****rc2||ddS)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 usersNre)r3r8 reseller_names r_get_user_packageszGeneralPanel._get_user_packagess e344444rc|jdkrV||rtddS|||D]+\}}}td||*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)r8rz{},{})r-rOr{r1)r3r8rkrRrh_s rlist_reseller_usersz GeneralPanel.list_reseller_userss ?n , ,53444#'#:#:V^#:#_#_ 4 4WagnnS'223333 - ,  4 4rc2||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)rrrr4r9r;rD staticmethodrIrUr^rcrfrirlrorqrsrvrxr{rrrrrr)r)9s ! ! !****444777 KK\KBG$(1111f  \  " " "\ " ) ) ) ) < < < < G G G G : : : : 2 2 2 2 B B B B G G G G + + + + 5 5 5 5 4 4 4 4444444rr)ceZdZdZdZdZdZdZfdZdZ dZ d Z d Z dd Z dd ZdZddZddZddZddZddZddZddZddZddZxZS)r%z/var/cpanel/usersz/var/cpanel/packagesz/var/cpanel/resellersz/etc/trueuserownersNctt||j|_t j|_dSN) superr%r4r+get_sys_min_uidmin_uidr PanelPluginr2r3r,s rr4zCpanel.__init__<sK fd$$&&&6688 ".00rcd} t|d5}|}dddn #1swxYwYn#t$r~}d|d|d}||jr|d|z }t |t j||t j tYd}~nd}~wwxYw|S) rWz]http://kb.cloudlinux.com/2017/08/how-to-fix-the-issue-with-non-utf-symbols-in-packages-names/rXNUnable to read file 'z ', error is: z-. It looks like you use not an UTF-8 charset.z Please read the instruction: )file) rYrZUnicodeDecodeError startswithUSERDIRrOr?r@rIexitBAD_CODING_ERROR_CODE)r3r[ ENCODING_LINKr\r]rTmessages rr^zCpanel.get_file_linesAsDB  ,i%% (++-- ( ( ( ( ( ( ( ( ( ( ( ( ( ( (! , , ,EiEEaEEEG##DL11 ML]LLL ' + + + +   w ' ' ' H* + + + + + + + + ,s3A5 A9A9A 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)r3resultpattern file_contentlinestrippedrs r_get_users_resellers_dictz Cpanel._get_users_resellers_dictYs *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.0ls r z)Cpanel._get_resellers..~s3JJJa003JJJr)rrrRESELLERS_PATHr^)r3 resellersrs r_get_resellerszCpanel._get_resellerstsR 7>>$- . . K..t/BCCLJJ\JJJIrc 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 z PLAN\=.*$F fixed_stringmatch_any_positionmultiple_searchdata_from_filer=r)rrrr^listr rr)r3rrhrrs r get_packagezCpanel.get_packages 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 rrRr8z OWNER\=.*$Frrrr) rUrrjoinrrr^rr rrr)r3rRr8rkr<rrrs r _get_resellerzCpanel._get_resellers++5+AA  ?7<< h77Dw~~d## ?#22488 d !&',$)#/ ?%ay0066s;;A>H#QD4G4G4I4I(I(IxxrQrcNt|||dS)rr8N)rOrrns 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)r3filenames r _get_packageszCpanel._get_packagess 7== ) ) KJt77 K K7>>"',,t"I"IJJK#T*****7<<BBEJJJJJ  K K K Krc|}|D]N\}}|r3d|vr|ddd|vr*t|:|rtd|zOdS)Nr~rrWarning: %s is not a file.rrrrO)r3r8rris_files rrqzCpanel.list_packagess'')) !%!3!3!5!5 ? ? Hg ?(??x~~c1'='=a'@I'M'Mh ?2X=>>>  ? ?rc#pK|}|sdStj|jrtj|jD]} |j|}||jkr) tj |j|}||vr ||}n| ||}| |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) Nr)rrrrrrr+rMrrrr;rr rNrO) r3r8rzusers_resellers_dictrrRrrkrTs rr{zCpanel._get_user_packagessz $==??$  F 7== & & BJt|44 B BB/11(;;CT\)) * 7<< h??D#777#7#A#'#5#5c5#A#A%)]]8%<%<Jrr(H$0X5N5N  0 0 6 6AAAAA0!!!!a!  B B B Bs%DD1D,,D1c|||D]4\}}}|dkr(|t||||krt|5dS)Nrzrr{rO)r3rhr8rkrR 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/rz,getcontrolpaneluserspackages: User not foundrK) r+rPrQrrrrrrOr rNrL)r3rRr8usersuserrrhs rrozCpanel.list_user_packages  'O--c#hh77E ' '|c)D07>>$'''"..t44G"}}g  ' ' ( F F F FDEEEEEE F F F ' ' ' % & & & & & & 's'B C,CCc|}|D]`\}}|rCd|vr?|ddd}||vr,|||kr5t|d|J|s|rtd|zadS)Nr~rr rr)r3r8rkrrrres_names rrszCpanel.list_resellers_packagess'')) !%!3!3!5!5 ? ? Hg ?3(??#>>#q11!49,,)h(.B.BXXXxx89999 ? ?2X=>>> ? ?rc|}||vr|rtd|zdS|||dS)NzError: %s is not resellerr8rk)rrOrs)r3rkr8rs rrvzCpanel.list_reseller_packagess^'')) 9 $ $ >1H<=== F $$58$DDDDDrc .|d|vrN|dtfdtdt DrdS|||dS|rt ddSdS)Nr~c3VK|]#}dd|vV$dS)r~N)r)ripartsrs r z/Cpanel.list_users_in_package..+s<RR388E"1"I&&)3RRRRRRrrz/getcontrolpaneluserspackages: Undefined package)rranyrlenrfrO)r3rhr8rrs @@rrizCpanel.list_users_in_package's'')) '>>MM#&&ERRRRRU1c%jj=Q=QRRRRR    MM' " " " " "  E C D D D D D E Erc|}||vr||||dS|rtddSdS)Nrz8getcontrolpaneluserspackages: Undefined reseller package)rrfrO)r3rhrkr8rs rrlz%Cpanel.list_users_in_reseller_package2sf'')) y MM'M B B B B B  N L M M M M M N Nrcl||D]\}}}t|d|d|dSN,r)r3r8rRrrks rrxzCpanel.list_users9sR+/+B+B5+I+I > > 'Cx \\\88< = = = = > >rrr)NFN)rrrrrrrr+r4r^rrrrrrrqr{rfrorsrvrirlrx __classcell__r,s@rr%r%4s!G'J,N/J11111 06   ,RRRR4 4 4 4 4 K K K????"B"B"B"BH'''' ? ? ? ?EEEE E E E ENNNN>>>>>>>>rr%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)(r z"/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.listrNctt|tj|_t j|_|j |_ dSr) rr r4r"detect_DA_adminDA_ADMINrrr2get_encoding_nameENCODINGrs rr4zDirectAdmin.__init__IsZ k4  ))+++.00 '355);;== rc& t|d|j5}|}dddn #1swxYwY|S#t$r?}d|d|jd}||d|dzt ||d}~wwxYw)NrX)encodingrz '. It looks like you use not an z charset.z Error is: .)rYrrZrrI Exception)r3r[r\r]rTrs rr^zDirectAdmin.get_file_linesPs ,it}=== (++-- ( ( ( ( ( ( ( ( ( ( ( ( ( ( (N! , , ,OiOO6:mOOOG   w);q);););; < < <G$$! +  ,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_innerrrIr1r)r3r<rTtpls r_get_user_infozDirectAdmin._get_user_info[so $,,X66 6 $ $ $OC   szz(A66 7 7 7!## #  $s A9AAc \tj|j|d} ||}n #d}YnxYw|st dt tdddd|}t tdddd|} |d d d }n#t$rt d wxYw |d d d }n#t$rt d wxYw| ||}|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 configrkrDEFAULT)rrr DA_USERS_DIRr^rLrr rr IndexError_get_user_packager+rM_is_reseller_limits_enabled) r3r< userprofileuserprofile_contentresult_usertyperesult_creatorusertyperkrhlvp_idrRs rrz DirectAdmin._get_user_info_innerks gll4#4h LL  '"&"5"5k"B"B   '"&   " GEFF Ft $!.      d $!.       D&q)//1177<HH C C CABB B C((3FGG z ! !H_,,X66F//77 $##o%%h//GX%%s!>A3CC)-3D!!D;c6|j|Sr)proc_lve exist_lvp)r3r s rrz'DirectAdmin._is_reseller_limits_enableds}&&v...rr<rreturnc |sWtj|j|d} ||}n #d}YnxYw|st dt tdddd|}t tdddd|} |d d d }n#t$rt d wxYw|d krT|rR |d d d }n#t$rt d wxYw|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^rLrr rrr)r3r<rrresult_packageresult_original_packagerhs rrzDirectAdmin._get_user_packages # K',,t'8(KPPK +&*&9&9+&F&F## +&*###& K !IJJJd $!.      #'t #$!. ( ( ( # #  C$Q'--//55c::1=GG C C CABB B C h  #:  P1!4::<<BB3GGJ P P P !NOOO Ps#AA3CC+73D++EFc#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) r<r8N)setr9rrrrUrr)r3r8rzr9r<rRrhrks rr{zDirectAdmin._get_user_packagess$**,,--  4#455 ) )H;&&'''GGO )-)<)r}) rrrrexistsr^rrstriprrOr1r;) r3r8rkrreseller_usersr<rRrhr~s rrzDirectAdmin.list_reseller_userssJw||D-xFFw~~d##  F,,T22& 0 0H "&"5"5hood6K6K"L"LWaa"     '..g.. / / / /}}X&& 0 "&"5"5h"?"?Waa"     '..g.. / / / / /  0 0s$",B BBC33 DDc|||}|r< ||\}}}t|dS#t$rYdSwxYwdS)z Determine user's reseller based on package 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 rNrUrrOr)r3rRr8r<r~rks rrzDirectAdmin.get_reseller s++5+AA   !%!4!4X!>!>1hh#      A AAc,||S)z Check login_name is da admin. Backward compatibility wrapper :param login_name: Admin name :return: )r;)r3 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)r3rrrrrrs ris_da_admin_for_hookz DirectAdmin.is_da_admin_for_hook"sw||D-z;GG 7>>$   "..t44L"4"#( %+ $$$O "*1-3355;;C@@Cw&&!F rcB ddlm}m}m}m}n3#t $r&t dtjdYnwxYw| }|D]F} t|#|||f$r)}t dt|zYd}~?d}~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 rz%s N) clsudor#r$r%r& ImportErrorrOr?rr9evalstr) r3s_cmdr#r$r%r& da_adminsrrTs radd_all_da_admins_to_sudoersz(DirectAdmin.add_all_da_admins_to_sudoers@s   Y X X X X X X X X X X X X    Z [ [ [ HQKKKKK $$&&  ) )D )U  02CD ) ) )fA'(((((((( ) ) )s$ -??A++B3BBc,||S)z< Wrapper for compatibility with old code )r9r7s rget_all_da_adminszDirectAdmin.get_all_da_adminsTs&&&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>rrrs rrz+DirectAdmin.list_admins..ds$DDDtT**DDDr)rrr DA_ADMIN_LISTr^)r3r8r,rs rr9zDirectAdmin.list_adminsZsR 7>>$, - - E..t/ABBLDD|DDDIrc#vK||j}|D]}|dVdSNr>)r^DA_ADMINS_PACKAGESr)r3rrs rrzDirectAdmin._get_packagesgsP**4+BCC   $ $D++d## # # # # $ $rcR|D]}t|dSr)rrO)r3r8rs rrqzDirectAdmin.list_packagesls4&&((  D $KKKK  rc\|D]\}}}t||dSrr)r3r8rRrhr~s rrfzDirectAdmin.list_allps@#6688  OC! #w      rc|D]*\}}}tt|d|d|+dSr)r{rOr*)r3r8rRrhrks rrxzDirectAdmin.list_userstsV&*&=&=&?&? > > "C( C'''88< = = = = > >rc|||}|r< ||\}}}t|dS#t$rYdSwxYwdS)Nrr)r3rRr8r<r~rhs rrozDirectAdmin.list_user_packagexs++5+AA    $ 3 3H = = 7Ag#      rcj|dD]\}}}||krt|dS)Nrrr)r3rhr8rRpackage_rks rriz!DirectAdmin.list_users_in_packagesL''b'99   #C87""c   rcj||D]\}}}||krt|dS)Nrr)r3rhrkr8rRr=s rrlz*DirectAdmin.list_users_in_reseller_packagesL''h'??   #C87""c   rc g}tj|jr&||j}d|D}||tt|S)z0 Return list of resellers names c^g|]*}||+Srr2rs rrz.DirectAdmin._get_resellers..s-MMMQ!((**MahhjjMMMr) rrrDA_RESELLERS_LISTr^extendr9rr)r3resellers_listrs rrzDirectAdmin._get_resellerss 7>>$0 1 1 N..t/EFFLMM,MMMNd..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|]*}||+Srr2rs rrz6DirectAdmin._get_reseller_packages..s-LLLALQXXZZLLLr)rrrrrr^)r3rk packages_list package_pathrs r_get_reseller_packagesz"DirectAdmin._get_reseller_packagessf w||D$5xQQ 7>>, ' ' M..|<z5DirectAdmin.list_resellers_packages..s+2D2DVSRU2V2Vrr)rrHr functoolsreducerrO)r3r8first_exceptionrkpackagesrT out_strings rrsz#DirectAdmin.list_resellers_packagess++--  H 66x@@   "*&'O  #)(0VVVegg  *      &! ! ' &s0 AAAcptd||dSr6)rOrrHrus rrvz"DirectAdmin.list_reseller_packagess0 dii33H==>>?????rrrr)*rrrrDA_CONFr4rAr7rrr+r r r4r^rrrr*rrrr{rrrr!r-r/r9rrqrfrxrorirlrrHrsrvrrs@rr r >sJ7L>>>> , , ,$$$ 8&8&8&t///''#'HTRUYDW'cf''''R))))800008    ")))<)))(''''    $$$     >>>> ) ) )   """"(@@@@@@@@rr ceZdZdZdS)ISPManagerGetPackagesExceptionc<t||dSr)rr4)r3rs rr4z'ISPManagerGetPackagesException.__init__s4)))))rN)rrrr4rrrrVrVs#*****rrVcpeZdZdZdZdZfdZdZed dZ d dZ d d Z d d Z d d Z d d ZxZS)rz!/usr/local/ispmgr/etc/ispmgr.confN mgrsecurecNtt|tjtjd}t|d|_tj |_ tj |_ dS)Nrr)rrr4r"getCP CP_VERSIONrrQ isp_major_verispmanager5_is_masterisp5_is_masterrrr2)r3 ver_partsr,s rr4zISPManager.__init__s| j$((*** %++C00  1..$:<<&244rc i}|jdkrtj|jst d|jz t |jd}|d}| d|D]}|d}t|j | dd}|d}|D]}|d rvd |d d }||vr||d zt#|z||<t#|||<n#t$t&f$r,}t d |jdt#|d }~wwxYwdd l} ||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 %srXAccountr"rr>PresetrrNzERROR: Can't read z - default)r]rrr ISP4_CONFrVrYreadrpoprQr+rMreplacerrrr*OSErrorIOErrorgrpgetgrnamISP5_GRPgr_memr rNKeyError) r3dict_uid_packagelinesrrRline1pkg_namerTrm panel_usersrs r_get_user_packages_dictz"ISPManager._get_user_packages_dicts   " "7>>$.11 ^45Kdn5\]]] mT^S116688 I.. ! ! F FD**,,q/Cdo55ckk$6K6KLLMMC::d++D!%FF ;;==33H==F'*xx 0C0C0E0Eabb0I'J'JH"&6668H8MPS8SVYZbVcVc8c 0 5 58;H 0 5 F FW% m m m44TXTbTbTbdghidjdjdj5klll m JJJ !ll4=99@ 'D"o55d;;09(-- 4      sO E$F00G-'G((G-5#IH98I9I I I  I IIFc(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)rO)clsrRr8rks rrzISPManager.get_resellers hrc  |}t|D]}t|dS#t$r.}t|t jdYd}~dSd}~wwxYwNr)rwrvaluesrOrVr?r)r3r8rrrhrTs rrqzISPManager.list_packagess #;;== /668899  g  -    !HHH HQKKKKKKKKK sAA B#A>>Bc |}|D]*}tt|dz||z+dS#t$r.}t|t jdYd}~dSd}~wwxYw)NrrrwrOr*rVr?rr3r8rrrRrTs rrfzISPManager.list_alls #;;== ' > >c#hhn'7'<<==== > >-    !HHH HQKKKKKKKKK AA A=#A88A=c0 t|}|}||vrt||dSdS#t$r.}t|t jdYd}~dSd}~wt $rtdYdSwxYw)NrrK)rQrwrOrVr?rrL)r3s_uidr8rRrrrTs rrozISPManager.list_user_package#s 'e**C#;;== &&&&s+,,,,,'&-    !HHH HQKKKKKKKKK ' ' ' % & & & & & & 's>CCFc#pKd}|-d|}|||g}nD|-d|}|||g}n||}|D];\}}}|p|j}|dkrdn|}|||}|r ||||fV>E,,U]ODDFF  !077>>E,,UXJ??FF,,U33F-3 / / )Xw0G%00rrhH**HE*JJC /COGX....  / /rcdt|jz}||D]}t|ddS)z Print packages (exclude reseller's) :param bool debug: Do produce debug output or don't :return: packages names zs SELECT name FROM psa.Templates WHERE owner_id = %(admin_id)s AND type = 'domain'; admin_idrN)dictADMIN_IDrrO)r3r8rrs rrqzPlesk.list_packagessZ DM***+ ++E22  D $q'NNNN  rrRr8cFd}|jt|}|r^ddgt |z}d|z}||t |}|r|dd}t|dkrdn|dS)z Get reseller name from DB :param string uid: uid of user :param bool debug: Do produce debug output or don't :rtype: string :return: reseller name rrz%saJSELECT reseller.login FROM sys_users AS sys_user JOIN hosting AS hosting ON hosting.sys_user_id = sys_user.id JOIN domains AS domain ON hosting.dom_id = domain.id JOIN clients AS reseller ON domain.vendor_id = reseller.id WHERE sys_user.login IN (%s)rr N)r+rPrQrrrtuplerO)r3rRr8rk usernamesformat_stringsrrs rrzPlesk.get_resellersO--c#hh77  ( XXtfs9~~&=>>N0 3A AE ,,UE)4D4DEEF (!!9Q< H''bbX66666rc||}|D]6\}}}tdt||7dS)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 r{} {}Nr{rOr1r*)r3r8rrRrhr~s rrfzPlesk.list_alls_''e'44!& 5 5 S'1 '..S733 4 4 4 4 5 5rc||}|D]7\}}}tdt|||8dS)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 rz{},{},{}Nr)r3r8rrRrhrks rrxzPlesk.list_userssg''e'44(- B B $S'8 *##CHHgx@@ A A A A B Brcg} |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 )r8r<cg|] }|d S)rrr3s rrz+Plesk.list_user_package..s < < O--c#hh77E > >00ut0LL < (    a ' ' ' % & & & & & '    G 'NNNN  s'A''B+6B  B+*B+cdt||jz}||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 = '%(package)s' AND t1.owner_id = %(admin_id)s AND t1.type = 'domain'; )rhrrN)rrrrOr+rM)r3rhr8rlogins rrizPlesk.list_users_in_packagesp  7T];;; <,,U33 5 5E $/))%(33 4 4 4 4 5 5rcd|z}||}t|dkrdSt|dd}dt||z}||}|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 zCSELECT id FROM psa.clients WHERE type = 'reseller' AND login = '%s'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 = '%(package)s' AND t1.owner_id = '%(reseller_id)s'; )rh reseller_id) rrrQrr+rMrOr*r rN) r3rhrkr8reseller_queryrrrrluidrTs rrlz$Plesk.list_users_in_reseller_packagescemm--n== {  q F+a.+,,   7 <<< =((// ! !D !..tAw77 c$ii    ,   !HHH  ! !s9 B66C CC cdt|jz}||D]C}|d}|ddkrdn|d}td||DdS) 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 != %(admin_id)s AND t1.type = 'domain';rrrr rootrN)rrrrOr1)r3r8rrrhrks rrszPlesk.list_resellers_packagessEHLUYUbGcGcGcd++E22 5 5D1gG!%aG!3!3vvaH '..733 4 4 4 4 5 5rr cg}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)rappendrQ)r3rLrrrhrk_ids rlist_domain_packages_with_idz"Plesk.list_domain_packages_with_id-s %++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)r3rrrs r$get_package_name_by_id_from_plesk_dbz*Plesk.get_package_name_by_id_from_plesk_db>s/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)r3rrrs r$get_package_id_by_name_from_plesk_dbz*Plesk.get_package_id_by_name_from_plesk_dbFs/L&&u|o>>Awqzrc|dkrd}tjd|sdSdt||jz}||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 = '%(reseller)s' WHERE t1.type = 'domain' AND t1.owner_id != %(admin_id)s;)rkrr)rrrrrrO)r3rkr8rrs rrvzPlesk.list_reseller_packagesNs v  Hx X.. 4EHLU]hlhuGvGvGvw++E22  D $q'NNNN  rcdgS)Nr rr7s rr9zPlesk.list_adminsbs yrr)FNNr)rrrrrrrr+r4rr{rqr*boolrrfrxrorirlrsrrrrQrrrrvr9rrs@rrrCs(JHJJ000004444&/&/&/&/P"777D7777. 5 5 5 5 B B B B25555.!!!!!!!!F5555&d5#S9P3Q.R"ss(rrceZdZdZdS)rcp|rtjdtjddS)Nz"Doesn't support InterWorx anymore r)r?r@rArrBs rrDzInterWorx._warninggs3  D J  B C C C  rNrrrrDrrrrrfs#rrceZdZdZdS)r&c&td|z)Nz'%s wasn't implemented for Unknown panelNotImplementedErrorrBs rrDzUnknown._warningns!"Kk"YZZZrNrrrrr&r&ms([[[[[rr&ceZdZdZdS)r!c&td|z)Nz)%s wasn't implemented for HostingNG panelrrBs rrDzHostingNG._warningss!"MP["[\\\rNrrrrr!r!rs(]]]]]rr!)* __future__rrbuiltinsrrrr?rFrNtypingrrrclcommonr r clcommon.clprocr clcommon.utilsr clcommon.cpapi.pluginsr rrr cldetectlibr"rrrr'objectr)r%r rVrrrr&r!rrrrs&%%%%%&&&&&& ((((((((((%%%%%%%%######IIIIIIIIIIII     i   $x4x4x4x4x46x4x4x4vG>G>G>G>G>\G>G>G>TA@A@A@A@A@,A@A@A@H *****Y*** yyyyyyyyx`````L```F  [[[[[l[[[ ]]]]] ]]]]]r