1A4ddlZddlZddlZddlmZddlmZddlmZm Z ddl m Z ddl m Z ddlmZmZddlmZdd lmZd Zd Zd ZGd deZGddeZGddeZGddZGddZGddZdS)N)Optional)ProcLve)cpapiClPwd) NotSupported) ve_config) PyLveErrorPyLve)config) id_registryresellerceZdZdS) NameMapErrorN__name__ __module__ __qualname__ py/lveapi.pyrr!DrrceZdZdS)NameMapConfigErrorNrrrrrr%rrrceZdZdS)NameMapNotInitializedNrrrrrr)rrrcJeZdZdZefdZdZdZdZd dZ d Z d d Z d Z dS)NameMapz Container for backend storing resellers_name<=>resellers_id map As backend store use ve.cfg Usage: >>> name_map = NameMap() >>> name_map.link_xml_node() >>> name_map.id_list() [1001] c0||_d|_d|_dSN) _xml_tag_name _xml_node_reseller_id_name_map)self xml_tag_names r__init__zNameMap.__init__9s)%)"""rcN|D]\}}||kr|cSdSr!load_from_node)r%namename_id_s rget_idzNameMap.get_id?sB--//  JE3}}   rcN|D]\}}||kr|cSdSr!r))r%r-r,_ids rget_namezNameMap.get_nameDsB--//  JE3czz   rc>d|DS)Ncg|]\}}|Srr).0_r-s r z#NameMap.id_list..Js8883888rr)r%s rid_listzNameMap.id_listIs"88$"5"5"7"78888rNTcb|d|_||dS||_d|_dS)aC Initialize NameMap. If xml_node is none, config will be loaded automatically :param use_cache: Bool whether bypass ve.cfg xml cache :param xml_node: !! DEPRECATED PARAM !! this param is left only for compatibility with our old code N)r#_load_resellers_map_from_ve_cfgr$)r%xml_node use_caches r link_xml_nodezNameMap.link_xml_nodeLsB  !DN  0 0 ; ; ; ; ;&DN)-D & & &rcg|_||\}}|D]b}|d}t|d}|r'|r%||jvr|j||fc~~dS)zT Fills self._reseller_id_name_map from ve.cfg file :return: r<useridN)r$_try_get_xml_node getAttributeintappend)r%r<ve_cfgr;el_r+r-s rr:z'NameMap._load_resellers_map_from_ve_cfg^s &("11I1FF ? ?C##F++Dc&&t,,--C ? ?4+E E E*113+>>>  FFrc tj|\}}n.#tj$r}d|_t d|d}~wwxYw|||jfS)Nr?z-Error happened while loading data from ve.cfg)rget_xml_configBadVeConfigExceptionr$rgetElementsByTagNamer")r%r<rFr;es rrBzNameMap._try_get_xml_nodens ](7)LLL FHH- ] ] ])-D &$%TUU[\ \ ]x44T5GHHHHsAAAc#PK|j|jtd|jrc|j|jD]C}|d}t |d}|r|r||fVD|jr|jD] \}}||fV dSdS)z? Obtain data from xml node as (name, id_) list NzLName map is not initialized. Use obj.link_xml_node() to get data from configr@rA)r#r$rrKr"rCrD)r%rGr+r-s rr*zNameMap.load_from_nodevs > !d&@&H')Z[[ [ > $~::4;MNN $ $''//#**40011$C$)OOO  % !7  TCi    r)NT)T) rrr__doc__LVP_XML_TAG_NAMEr'r.r1r8r=r:rBr*rrrrr-s  %5****   999....$ IIII     rrcpeZdZdZdZdZd dZdZdZdZ d Z e d Z e d Z d ZdS)LvpMapzl Container for storing information about lve:lvp mapping In which reseller container stored lve c|t|_i|_i|_d|_t |_dSr!)rname_map _id_name_map _name_id_map_reseller_id_map_panelr_pwdr7s rr'zLvpMap.__init__s4  &*#GG rc.||j|<||j|<dSr!)rTrU)r%r+r-s r_add_mapzLvpMap._add_maps"!%#"%$rNcp |j|jS#tj$r|cYSwxYwr!)rWget_pw_by_namepw_uidrNoSuchUserException)r%r+defaults rr\z LvpMap.pw_uidsG 9++D118 8(   NNN s !55c||}||S|jtj|_|j|Sr!)r\rVrget_reseller_id_pairsget)r%r uids r_get_panel_reseller_idzLvpMap._get_panel_reseller_idsPkk(## ?J  & .*/*E*G*GD '*..x888rc|j|p|j|}||S ||}n#t $rd}YnwxYw|||||S)z Convert reseller name to an LVE id. It supports resellers without a system account (for Plesk compatibility). N)rSr.rUrarcrrY)r%r+rbs rget_reseller_idzLvpMap.get_reseller_ids m""4((GD,=,A,A$,G,G ?J --d33CC   CCC  ? MM$ $ $ $ sA AAc*|j|p|j|}||S t j|j}tj|r| ||nd}n#t$rd}YnwxYw|S)z Convert reseller id to reseller name It support resellers without system account (for Plesk compatibilyty) N) rSr1rTrapwdgetpwuidpw_namer is_resellerrYKeyError)r%r-r+s rget_reseller_namezLvpMap.get_reseller_names }%%c**Hd.?.C.CC.H.H  K <$$,D &&  dC((((   DDD  sAB BBc#Kttj}i}|D]N} ||||<#t$r&t jt jd|dYKwxYwtjdD]\\}}||}|$t jt jd|d@| |d}||fV]dS)z This method loops over all user:reseller pairs in control panel and returns appropriate lve_id:lvp_id pairs. THIS METHOD WON'T CHECK IF 'RESELLER LIMITS' IS ENABLED IN ve.cfg z Reseller > still exists in control panel, but absent in /etc/passwd file)cploginr )keylsNuser r) setr resellersrersyslog LOG_WARNINGcpinfor\ra)r%rs reseller_uidsr rolve_idlvp_ids r lve_lvp_pairszLvpMap.lve_lvp_pairss` ))**  ! J JH J*.*>*>x*H*H h'' J J J &)IH)I)I)IJJJJJ J"'4K!L!L!L ! ! GX[[))F ~ &)I)I)I)IJJJ"&&x33F&.  ! !sA-A32A3c#>KtjD]}|VdSr!)rrs) reseller_names rrszLvpMap.resellerss6"_..  M      rcg}tj|}|D]d} tj|j}||2#t $r&tjtjd|dYawxYw|S)z: Obtain from control panel resellers uids rqrn) rreseller_usersrggetpwnamr\rErkrtru)r+uidsr~r@r-s rrwzLvpMap.reseller_uidss -d33" J JD Jl4((/ C     J J J &)I)I)I)IJJJJJ J s.A  -A;:A;cV||}||Sr!)rlrw)r%ryr|s rlvp_lve_id_listzLvpMap.lvp_lve_id_lists)..v66 !!-000rr!)rrrrNr'rYr\rcrerlrz staticmethodrsrwrrrrrQrQs&&& 9 9 9"&!!!:  \ \ 11111rrQcXeZdZddZdZdZdZdZdZdZ d Z d Z d Z d Z d ZdS)LveNc|p t|_|p t|_|p t |_t |_dSr!)rprocr pyrQmaprr_mapped_domain_users)r%rrrs rr'z Lve.__init__ sB%GII -?&((),!!!rc#Kt|jj}|jD]\}}||vr||fV|dfVdS)a5 Obtain {lve id}:{lvp id} pairs iterator based on ve.cfg config (detect enabled resellers containers) This method (unlike LvpMap.lve_lvp_pairs) will check if reseller is enabled in ve.cfg and return lvp_id=0 for users of reseller with disabled reseller limits rN)rrrrSr8rz)r%enabled_lvp_idrxrys rlve_id_lvp_id_pairszLve.lve_id_lvp_id_pairss~TX.668899"h4466  NFF''fn$$$$ai   rcN|D]\}}||kr|cSdS)z\ Obtain lvp id based on ve.cfg config (detect enabled resellers containers) r)r)r%rxlve_id_lvp_id_s rlve2lvpz Lve.lve2lvp!sB!% 8 8 : :   GW  !qrctj|jr.|j|d}nd}|jj|g|Ri||dkrC tj ||j ||dS#t$rYdSwxYwdS)zH safe destroy lve container with preserving lvp mapping rN) ospathexistsr proc_lve_maprrar lve_destroyrgrh lve_lvp_maprk)r%rxargskwargsrys rrzLve.lve_destroy*s 7>>$)0022 3 3 Y]]__((33FFFF4T444V444 Q;;  V$$$##FF33333     ;s/B55 CCctj|} tj|j}t t j|pg}n#t$ri}YnwxYwg}|j D]j}|j s | |j }|'tj ||}|||jfk|S)uResolve all domain→docroot→domain_id mappings once. Returns a list of (domain_id, limits_dict) tuples. Callers pass this to _map_domain_lves / apply_domain_lve_limits to avoid redundant resolve_docroot + assign_domain_id calls. Uses cpapi.userdomains() to fetch all domain→docroot pairs in a single file read instead of calling resolve_docroot per domain, which would re-parse the entire userdatadomains file each time. ) _ws_config load_configrgrhridictr userdomainsrkdomainsr+ra_ws_id_registryassign_domain_idrElimitsto_dict) r%rxr usernamedocroot_by_domainentriesddocroot domain_ids r_build_domain_mapzLve._build_domain_map:s'// #|F++3H $U%6x%@%@%FB G G   # # # "    # < [lvp] ← reseller LVP (if enabled) lvp ← user-level LVP with isolation lve ← user LVE lve ... ← domain LVEs lvp<0> [lvp] ← reseller LVP (without isolation) lve ← user LVE (flat, existing behaviour) r)ry)rrN)rrrdomains_supportedrrrfind_all_lve_ids_with_configr exist_lvplve_lvp_createlve_lvp_create2rarrrr)r% proc_map_dictisolated_usersrxryrs r _sync_mapz Lve._sync_maps$   7 $ $ & & # !H!J!JKKNN UUN"6688 3 3NFF''Q;;ty':':&':'I'I;G**6222 y**&*9977//????..v666!$$VQ//699G((888,2M&)!:::!%!7!7!?!?J))&=5?*AAA!$$VQ//6999..f.==7..v666G((888,2M&)A 3 3rcR |dS#t$rYdSwxYw)zZ wrapped _sync_map function for prevent error if some cpapi not supported N)rrr7s rsync_mapz Lve.sync_maps?  NN         DD s  &&cL tjS#t$rYdSwxYw)z^ Check if current panel supported for reseller's limits; :rtype: bool F)ris_reseller_limits_supportedrr7s ris_panel_supportedzLve.is_panel_supporteds8  577 7   55 s  ##ct|j|j|fS)zo Check present all needed (kmod-lve, liblve, /proc/lve, panel) for manipulate resellers limits )allrresellers_supportedrrr7s rreseller_limit_supportedzLve.reseller_limit_supportedsKDG//11I1133++--/00 0rct|j|jfS)zh Check present all needed (kmod-lve, liblve, /proc/lve) for manipulate resellers limits )rrrrr7s ris_lve10z Lve.is_lve10s3DG//11493P3P3R3RSTTTr)NNN)rrrr'rrrrrrrrrrrrrrrr s////     <...6+++Z>3>3>3@000UUUUUrr) rrtrgtypingrclcommon.clprocrclcommonrrclcommon.cpapi.cpapiexceptionsr clveconfigrlve_utils.pylve_wrapperr r websiteisolationr rr rrO LVE_NO_UBCLVE_NO_MAXENTER ExceptionrrrrrQrrrrrs ######!!!!!!!!777777 55555555111111;;;;;;        9                L   [ [ [ [ [ [ [ [ |z1z1z1z1z1z1z1z1~uUuUuUuUuUuUuUuUuUuUr