grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026a U‰¨jš.ã@s¦ddlZddlZddlZddlZddlZddlZddlZddlTddlmZdZ dZ dZ dZ dZ dZejeZde_d e_de_d e_d d „Zd d„Zdd„Zdd„Zdd„Zdd„Ze d¡Ze dej¡Zdd„Z dd„Z!dd„Z"dd „Z#d!d"„Z$dMd#d$„Z%dNd%d&„Z&d'd(„Z'd)d*„Z(d+d,„Z)d-d.„Z*d/d0„Z+d1d2„Z,d3d4„Z-d5d6„Z.d7d8„Z/d9d:„Z0d;d<„Z1d=d>„Z2d?d@„Z3dAdB„Z4dCdD„Z5dEdF„Z6dGdH„Z7dIdJ„Z8dKdL„Z9dS)OéN)Ú*)ÚPIPEz0.0.5ééééz/usr/local/lswsFcCstjddd�dS)Nz3%(asctime)s.%(msecs)03d [%(levelname)s] %(message)sz%Y-%m-%d %H:%M:%S)ÚformatZdatefmt)ÚloggingZ basicConfig©r r ú"/usr/local/lsws/lsns/bin/common.pyÚ init_loggingsÿr cCstjS©N©ÚthisÚ serverRootr r r r Ú server_rootsrcCs |t_dSr r)Úrootr r r Úset_server_rootsrcCstƒd|S)Nz /lsns/conf/©r©Úfileonlyr r r Ú get_conf_file!srcCstƒd|S)Nz /lsns/bin/rrr r r Ú get_bin_file$srcCst |¡t d¡dS)Nr)r ÚerrorÚsysÚexit)Úmsgr r r Ú fatal_error's rz\A[A-Za-z0-9 _.\-+]{1,64}\Zz\A-?\d+[KMGT]?\ZcCsDt|tƒrt |¡s td|ƒd|vs4| ¡dvr@td|ƒ|S)zàAllowlist package names to prevent path traversal in pkg_to_filename(). cPanel/Plesk allow spaces in plan/package names (e.g. 'Default Domain'). Reject anything with path separators, control chars, or other oddities.zInvalid package name: %rz..)ÚÚ.)Ú isinstanceÚstrÚ _PKG_NAME_REÚmatchrÚstrip©Úpkgr r r Úvalidate_pkg_name/s   r'c CsHz t|ƒ}Wn"ttfy.td|ƒYn0|dkrDtd|ƒ|S)zRCoerce uid to int; reject strings starting with '-' that would be parsed as flags.zInvalid UID: %rrzInvalid UID (negative): %r)ÚintÚ TypeErrorÚ ValueErrorr)ÚuidÚnr r r Ú validate_uid;s  r-cCs"t|ƒ}t |¡std|ƒ|S)z\Allow only numeric cgroup values (optionally suffixed K/M/G/T) before passing to subprocess.zInvalid numeric value: %r)r!Ú_NUMERIC_VAL_REr#r)ÚvalÚsr r r Úvalidate_numeric_valueEs  r1cCsDtj |¡}tj |¡}||kr@| |tj¡s@td||fƒ|S)zNEnsure realpath(path) is contained under realpath(root). Returns the realpath.z+Path escapes expected root: %r not under %r)ÚosÚpathÚrealpathÚ startswithÚsepr)r3rZrpZrrr r r Úvalidate_path_underLs   r7cCsgd¢S)N)ÚcpuÚioÚiopsÚmemÚtasksr r r r r Ú get_optionsTsr=c Cs| ¡rjzt t|ƒ¡}WqÆtyf}z4|s>td||fƒt d||f¡WYd}~dSd}~00n\zt |¡}WnLtyÄ}z4|sœtd||fƒt d||f¡WYd}~dSd}~00|j t ƒk�r|�sîtd|j t ƒfƒt d|j t ƒf¡dS|dfS)NzError getting UID for %s: %s)NFzError getting name for %s: %sz#Specified uid: %d < minimum uid: %dT) ÚisdigitÚpwdÚgetpwuidr(Ú Exceptionrr ÚdebugÚgetpwnamÚpw_uidÚ get_min_uid)ZparamÚno_fatalÚ user_infoÚerrr r r Úget_userWs*rIcCs.g}|D] }t||ƒ\}}|r| |¡q|Sr )rIÚappend)ÚuidsrFÚusersr+rGZgotr r r Ú get_usersos  rMcCstj d¡rdSdS)Nz/etc/plesk-releaseTF)r2r3Úexistsr r r r Ú get_pleskws rOcCstƒr dSdS)Ni'iè)rOr r r r Úget_def_min_uid|srPc Cs<tjdkrtjStdƒ}zt|dƒ}WnXty~}z@tjdur\t d||tƒf¡dt_tƒt_tjWYd}~Sd}~00z |  ¡}WnTtyà}z}|jtƒkr&q|j|vr2q|jdkr>q|||j<| |¡q|S)NZnobody)r?ÚgetpwallrDrEÚpw_namerJ)Zuid_dictZ final_usersrLÚuserr r r rZœs     rZcCs tƒdS)Nz/lsns/conf/lscntr.txtrr r r r Úcontainer_file«sr]cCs tƒdS)Nz/conf/httpd_config.confrr r r r Ú ols_conf_file®sr^cCs tƒdS)Nz/conf/httpd_config.xmlrr r r r Úlsws_conf_file±sr_cCs tƒdS)Nz /lsns/conf/ns_disabled_uids.confrr r r r Úget_disabled_uid_file´sr`cCs tƒdS)Nz/lsns/conf/packagesrr r r r Ú get_pkg_dir·sracCsR|dkrt|ƒtj tƒ¡sDtj tƒ¡s4tdƒtjtƒdd�tƒd|S)Nrz3Missing LiteSpeed high level installation directoryiÀ©Úmodez/%s.conf)r'r2r3ÚisdirrarrÚmkdirr%r r r Úpkg_to_filenameºsrfcCs tƒdS)Nz"/lsns/conf/redis_package_size.confrr r r r Úget_package_size_fileÇsrgcCst tƒtj¡stdƒdS)Nz5You must configure LiteSpeed for LiteSpeed Containers)r2Úaccessr]ÚF_OKrr r r r Úls_okÊsrjcCs"t dtj¡rdt_dStƒdS)Nz/etc/cagefs/cagefs.mpT)r2rhrirÚclrjr r r r Úls_cl_okÎsrlcCstjSr )rrkr r r r Úis_clÔsrmc Cs”t d||f¡z t |tjtjBtjBd¡}Wn4tyf}ztd||fƒWYd}~n d}~00zt  |d¡Wt  |¡n t  |¡0dS)z¿Create or update mtime of `file` WITHOUT following symlinks. Defends against unprivileged users planting a symlink at file (e.g. in $HOME) that would let root touch an arbitrary path.z restart_external %s by touch: %si¤zError touching %s: %sN) r rBr2rSÚO_WRONLYÚO_CREATÚ O_NOFOLLOWÚOSErrorrÚutimerW)ÚfileZdescÚfdrHr r r Útouch_restart_external×s &ruc Csi}zÊtj tƒ¡dkr–ttƒdƒ}t |¡}| ¡|dD]V}tj |¡}|D]}|j |krR|||j <qpqRtj  |¡sŠtj |dd�t |dƒq>|r¦t ddƒn&|D] }|j |vrºqªt |j d d ƒqªWn0tyþ}ztd |ƒWYd}~n d}~00dS) NrrQZ reset_listiírbz in lscntr.txtz,/usr/local/lsws/admin/tmp/.lsphp_restart.txtzfor allz/.lsphp_restart.txtzfor homezError managing restart: %s)r2r3Úgetsizer]rSÚjsonÚloadrWÚdirnameÚpw_dirr[rNrerurAr) rLÚallZ users_usedrYÚdatarsZdironlyr\rHr r r Úrestart_externalçs.          r}c Cs¤i}i}t d¡}g}|D]¶}t|ƒdkr:|dd…dkst|ƒdkrV|dd…dkst|ƒdkr„|dd…dks|dd…dkr„qd |}t |¡}t|jƒd krt d |d t|ƒ¡|  |¡|||<q|D]\}d }|rÖd}|D]D} || krøqêt|ƒt| ƒkrê|| dt|ƒ…krê|  | ¡d }qÞqêqÞqÖ|D]D}t  ||j ¡} t  ||j ¡} | |v�rni|| <||| | <�q8t dt|ƒdt|ƒ¡||fS)Nz/devrZloopéZcdromrZdmÚsrz/dev/rz filename: z statinfo: TFzFinal devices: z Block Devices: )r2ÚlistdirÚlenÚstatÚS_ISBLKÚst_moder rBr!rJÚremoveÚmajorÚst_rdevÚminor) Z block_devicesZ statinfo_devÚfilesZdevicesrsÚfilenameZstatinfoZdeviceZretryÚinnerr†rˆr r r Ú get_devicess@ d   $   rŒcCsÜ|dkr dSt|ƒ}|dkr&d}d}n:|dkr8d}d}n(|dkrJd}d}n|dkr\d}d }n|St||ƒd kr˜d ||tt||d d ƒƒ|f}nd |||f}tt|ƒƒ|kr¼|St d tt|ƒƒ||f¡|S)NrìÚTé@ÚGéÚMéÚKé z%d.%d%sz%d%sz%s != %s use %s)ÚfloatÚroundr(r!Úint_num_valuesr rB)Úvalstrr/ZdivisorZ qualifierZstr_numr r r Ústr_num_values#s.(ršc Cs"|dks|dkrdS| ¡r$t|ƒSt|ƒdkrr(r�rÚupperÚisalphar–rAr rB)r™ÚsuffixÚprefixZprefZ multiplierZflr r r r˜>s:     r˜)F)F):rwr r2r?ÚreÚ subprocessrr‚rÚVERSIONZ OPTION_CPUZ OPTION_IOZ OPTION_IOPSZ OPTION_MEMZ OPTION_TASKSÚmodulesÚ__name__rrTrrRrkr rrrrrÚcompiler"Ú IGNORECASEr.r'r-r1r7r=rIrMrOrPrErZr]r^r_r`rarfrgrjrlrmrur}rŒršr˜r r r r Ús^8        "