§ ;Š»jÊ5ãó<—ddlZddlZddlZddlZddlZddlmZdZdZ dZ dZ ej e ¦«ZGd„de¦«ZGd „d e¦«ZGd „d ¦«Zd „Zdd„Zdd„Zd d„Z d!d„Zd„Zd„Zd„Zd"d„Zdedefd„Zedefd„¦«Zd„Z dS)#éN)Úcachez/etc/cagefs/cagefs.mpz/usr/sbin/cagefsctlz/usr/share/cagefs-skeletonz /var/.cagefscó—eZdZd„Zd„ZdS)ÚCagefsMpConflictcó2—d|›dt›d|›d�|_dS)NzConflict in adding 'z' to z5 because of pre-existing alternative specification: 'ú')ÚCAGEFS_MP_FILENAMEÚ_msg)ÚselfÚnew_itemÚ existing_items ú‘/builddir/build/BUILDROOT/alt-python27-cllib-3.4.44-1.el8.cloudlinux.x86_64/opt/cloudlinux/venv/lib/python3.11/site-packages/clcommon/clcagefs.pyÚ__init__zCagefsMpConflict.__init__sE€ð T 8ð Tð TÕ2Dð Tð TØCPð Tð Tð Tð Œ ˆ ˆ ócó—|jS©N)r ©r s r Ú__str__zCagefsMpConflict.__str__s €ØŒyÐrN)Ú__name__Ú __module__Ú __qualname__rr©rr rrs2€€€€€ð ð ð ð ððððrrcó—eZdZdZd„ZdS)ÚCagefsNotSupportedErrorzCagefs Not Supported Exceptioncó<—t ||¦«dSr)Ú Exceptionr)r Úmessages r rz CagefsNotSupportedError.__init__&s€Ý×Ò˜4 Ñ)Ô)Ð)Ð)Ð)rN)rrrÚ__doc__rrrr rr#s)€€€€€Ø(Ð(ð*ð*ð*ð*ð*rrcó¢—eZdZdZdZdZd„Zd„Zd„Ze d„¦«Z d„Z d „Z d „Z e d „¦«Ze d „¦«Ze d „¦«Zd„Zd„ZdS)Ú CagefsMpItemz@!%*Úú!có„—|dd…dkr d|_dS| ¦«dkr d|_dS||_dS)z¾Constructor :param arg: Is either path to add to cagefs.mp or a raw line is read from cagefs.mp :param prefix: The same as adding prefix '!' to arg before passing it to ctorNéú#r )Ú _path_specÚstrip)r Úargs r rzCagefsMpItem.__init__/sI€ð ˆr�ˆrŒ7�cŠ>ˆ>Ø"ˆDŒOˆOˆOØ �YŠY‰[Œ[˜BÒ Ð Ø"ˆDŒOˆOˆOà!ˆDŒOˆOˆOrcó^—| ¦«dkr|�|j›d|d›�|_|S)z%Specify mode as in fluent constructorú@Nú,Ú03o)Úprefixr%)r Úmodes r r-zCagefsMpItem.mode<s;€ð �;Š;‰=Œ=˜CÒ Ð  DÐ$4Ø!%¤Ð=Ð=°4Ð=Ð=Ð=ˆDŒOàˆ rcó—|jSr©r%rs r rzCagefsMpItem.__str__Ds €ØŒÐrcó8—|dkrdS|ddkr|dzS|S)Nr ú/éÿÿÿÿr)Úpaths r Ú _add_slashzCagefsMpItem._add_slashGs,€à �2Š:ˆ:Ø�3Ø �Œ8�sŠ?ˆ?ؘ#‘:Р؈ rcód—t |¦«}| ¦«s| ¦«rdSt | ¦«¦«}t | ¦«¦«}| |¦«S©NF)rÚ_adoptÚis_dummyr4r3Ú startswith)r ÚanotherÚadoptedÚ this_pathÚtest_preexist_in_paths r Ú pre_exist_inzCagefsMpItem.pre_exist_inOs‹€Ý×%Ò% gÑ.Ô.ˆð �=Š=‰?Œ?ð ˜g×.Ò.Ñ0Ô0ð Ø�5å ×+Ò+¨D¯IªI©K¬KÑ8Ô8ˆ Ý ,× 7Ò 7¸¿ º ¹¼Ñ GÔ GÐØ×#Ò#Ð$9Ñ:Ô:Ð:rcó�—t |¦«}| ¦«s| ¦«rdS| ¦«| ¦«krdStjtjgi}g}| ¦«| | ¦«|¦«vS)NFT)rr7r8r,Ú_PREFIX_MOUNT_RWÚ_PREFIX_MOUNT_ROÚget)r Úexistingr;Úprefix_compatibility_mapÚ null_optionss r Úis_compatible_by_prefix_withz)CagefsMpItem.is_compatible_by_prefix_withZs¨€Ý×%Ò% hÑ/Ô/ˆð �=Š=‰?Œ?ð ˜g×.Ò.Ñ0Ô0ð Ø�5à �;Š;‰=Œ=˜GŸNšNÑ,Ô,Ò ,Ð ,Ø�4å$0Ô$AÅLÔDaÐCbÐ#cР؈ à�{Š{‰}Œ}Ð 8× <Ò <¸W¿^º^Ñ=MÔ=MÈ|Ñ \Ô \Ð\Ð\rcó—|jduSrr/rs r r8zCagefsMpItem.is_dummyis€ØŒ $Ð&Ð&rcóN—t|t¦«r|St|¦«Sr)Ú isinstancer)Úxs r r7zCagefsMpItem._adoptls%€å �a�Ñ &Ô &ð #؈Hå ‘?”?Ð "rcó8—| d¦«dS)zjCut off mode from path spec like @/var/run/screen,777 Only one comma per path spec is allowed ;-)r*r)Úsplit©Ú path_specs r Ú _cut_off_modezCagefsMpItem._cut_off_modess€ð �Š˜sÑ#Ô# AÔ&Ð&rcó@—| tj¦«Sr)ÚlstriprÚ PREFIX_LISTrMs r Ú_cut_off_prefixzCagefsMpItem._cut_off_prefix{s€à×Ò¥ Ô 8Ñ9Ô9Ð9rcóp—t t |j¦«¦«Sr)rrSrOr%rs r r3zCagefsMpItem.paths&€Ý×+Ò+­L×,FÒ,FÀtÄÑ,WÔ,WÑXÔXÐXrcóZ—|j| ¦«kr |jdSdS)Nrr )r%r3rs r r,zCagefsMpItem.prefix‚s)€Ø Œ?˜dŸiši™kœkÒ )Ð )Ø”? 1Ô%Ð %à�2rN)rrrrRr@rArr-rÚ staticmethodr4r>rFr8r7rOrSr3r,rrr rr*s€€€€€Ø€KØÐØÐð "ð "ð "ðððððððððñ„\ðð ;ð ;ð ;ð ]ð ]ð ]ð'ð'ð'ðð#ð#ñ„\ð#ð ð'ð'ñ„\ð'ðð:ð:ñ„\ð:ðYðYðYðððððrrcóJ—tj t¦«Sr)Úosr3ÚexistsÚCAGEFSCTL_TOOLrrr Úis_cagefs_presentr[‰s€Ý Œ7�>Š>�.Ñ )Ô )Ð)rr cóê—dD]F}||vrtd|›�¦«‚|�||vrtd|›�¦«‚||vrtd|›�¦«‚ŒGdgtj¢RD]}||vrtd|›�¦«‚ŒdS)N)ú ú z"path contains forbidden character z&added_by contains forbidden character z$prefix contains forbidden character r*)Ú ValueErrorrrR)r3Úadded_byr,Úchs r Ú_reject_cagefs_mp_injectionrb�sÏ€ððLðLˆØ �ˆ:ˆ:ÝÐHÀ"ÐHÐHÑIÔIÐ IØ Ð  B¨( N NÝÐLÀbÐLÐLÑMÔMÐ MØ �ˆ<ˆ<ÝÐJÀBÐJÐJÑKÔKÐ Kð àÐ.•\Ô-Ð.Ð.ðJðJˆØ �ˆ:ˆ:ÝÐHÀ"ÐHÐHÑIÔIÐ Ið ðJðJréícóü—|€d}|€d} tj|tjtjztjz¦«}n]#t $rPtj|¦«tj|tjtjztjz¦«}YnwxYw |�tj||¦«tj|||¦«tj |¦«dS#tj |¦«wxYw)Nr2) rXÚopenÚO_RDONLYÚ O_DIRECTORYÚ O_NOFOLLOWÚFileNotFoundErrorÚmkdirÚfchmodÚfchownÚclose)r3r-Úowner_idÚgroup_idÚdir_fds r Ú_mk_mount_dir_setup_permrq¡sï€àÐØˆØÐ؈ð MÝ”˜�rœ{­R¬^Ñ;½b¼mÑKÑLÔLˆˆøÝ ðMðMðMÝ Œ�‰ŒˆÝ”˜�rœ{­R¬^Ñ;½b¼mÑKÑLÔLˆˆˆðMøøøðØ Ð Ý ŒI�f˜dÑ #Ô #Ð #Ý Œ �&˜( HÑ-Ô-Ð-å Œ�ÑÔÐÐÐø�Œ�ÑÔÐÐøøøsŠ9AÁABÂBÂ"-C%Ã%C;Fcó —t¦«sdS|€ tddg}n td|g}|r-tj|tjtj¬¦«dStj|tjtjd¬¦«dS)Nz --wait-lockz --remount-allz --remount)ÚstdoutÚstderrF©rsrtÚcheck)r[rZÚ subprocessÚPopenÚDEVNULLÚrun)ÚuserÚremount_in_backgroundÚcommands r Ú_remount_cagefsr~ºs¦€Ý Ñ Ô ðØˆà €|Ý! =°/ÐBˆˆå! ;°Ð5ˆØð  ÝÔØ ÝÔ%ÝÔ%ð ñ ô ð ð ð õ ŒØ ÝÔ%ÝÔ%Øð  ñ ô ð ð ð rcó@‡ —t|||¦«t||||¦«t¦«sdStj t ¦«s3tjtdgtj tj d¬¦«t¦«tt dd¬¦«5}t||z¦« |¦«Š d„|D¦«} ˆ fd „| D¦«} | sb| d d ¦«|�&| ¦«}t#d ||¬ ¦«t#‰ |¬ ¦«|rt%|¬¦«n1‰  | d¦«st)‰ | d¦«‚ddd¦«dS#1swxYwYdS)u Add mount point to /etc/cagefs/cagefs.mp :param path: Directory path to be added in cagefs.mp and mounted from within setup_mount_dir_cagefs(). If this directory does not exist, then it is created. :param added_by: package or component, mount dir relates to, or whatever will stay in cagefs.mp with "# added by..." comment :param mode: If is not None: Regardless of whether directory exists or not prior this call, it's permissions will be set to mode. :param owner_id: Regardless of whether directory exists or not prior this call, it's owner id will be set to. If None, the owner won't be changed. :param group_id: Regardless of whether directory exists or not prior this call, it's group id will be set to. If None, the group won't be changed. :param prefix: Mount point prefix. Default is mount as RW. Pass '!' to add read-only mount point. Refer CageFS section at http://docs.cloudlinux.com/ for more options. :param remount_cagefs: If True, cagefs skeleton will be automatically remounted to apply changes. :param remount_in_background: If True, cagefs remount will be done in separate background process, without waiting for completion :returns: None Propagates native EnvironmentError if no CageFS installed or something else goes wrong. Raises CagefsMpConflict if path is already specified in cagefs.mp, but in a way which is opposite to mount_as_readonly param. Raises ValueError if `path`, `added_by`, or `prefix` contains a character that would forge or inject a cagefs.mp record (newline, carriage return, and — for `path` — the ',' mode separator or an '@!%*' prefix character). Nz --create-mpFruzr+úutf-8©Úencodingc3ó>K—|]}| ¦«V—ŒdSr)Úrstrip)Ú.0Ú file_lines r ú z)setup_mount_dir_cagefs..s.èè€Ð>Ð>¨y˜ ×(Ò(Ñ*Ô*Ð>Ð>Ð>Ð>Ð>Ð>rcó>•—g|]}‰ |¦«¯|‘ŒSr)r>)r…rJr s €r ú z*setup_mount_dir_cagefs..s,ø€ÐPÐPÐP !°x×7LÒ7LÈQÑ7OÔ7OÐP˜AÐPÐPÐPrréz# next line is added by )Úfile©r|r2)rbrqr[rXr3rYrrwrzrZryÚadd_new_line_to_cagefs_mprerr-Úseekr&Úprintr~rFr) r3r`r-rnror,Úremount_cagefsr|ÚfÚ trim_nl_iterÚpre_exist_optionr s @r Úsetup_mount_dir_cagefsr”Ñsø€õj   h°Ñ7Ô7Ð7å˜T 4¨°8Ñ<Ô<Ð<å Ñ Ô ð؈õ Œ7�>Š>Õ,Ñ -Ô -ð ÝŒÝ ˜]Ð +ÝÔ%ÝÔ%Øð  ñ ô ð õÑÔÐõ Õ  $°Ð 9Ñ 9Ô 9ðC¸QÝ ¨¡ Ñ.Ô.×3Ò3°DÑ9Ô9ˆà>Ð>¸AÐ>Ñ>Ô>ˆ ØPÐPÐPÐP |ÐPÑPÔPÐàð CØ �FŠF�1�a‰LŒLˆLàÐ#à#Ÿ>š>Ñ+Ô+�ÝÐ0°(ÀÐCÑCÔCÐCÝ �( Ð #Ñ #Ô #Ð #àð MÝÐ6KÐLÑLÔLÐLøà×6Ò6Ð7GÈÔ7KÑLÔLð CÝ" 8Ð-=¸bÔ-AÑBÔBÐ Bð'CðCðCñCôCðCðCðCðCðCðCðCøøøðCðCðCðCðCðCsÂ1CFÆFÆFcóŒ—ttdd¬¦«5}| ¦«cddd¦«S#1swxYwYdS)NÚrr€r�)rerÚ readlines)r‘s r Ú_get_cagefs_mp_linesr˜1s„€Ý Õ  #°Ð 8Ñ 8Ô 8ð¸AØ�{Š{‰}Œ}ððððñôððððððøøøððððððs ˜9¹=Á=cóŽ—ttdd¬¦«5}| |¦«cddd¦«S#1swxYwYdS)NÚwr€r�)rerÚ writelines)Úlinesr‘s r Ú_write_cagefs_mp_linesr�6sˆ€Ý Õ  #°Ð 8Ñ 8Ô 8ð#¸AØ�|Š|˜EÑ"Ô"ð#ð#ð#ð#ñ#ô#ð#ð#ð#ð#ð#ð#øøøð#ð#ð#ð#ð#ð#s ˜:º>Á>có¬—t¦«}|r?|ddkr5|dddkr%|dxxdz cc<t|¦«dSdSdSdS)zR Add new line to the end of /etc/cagefs/cagefs.mp file if it is not there rr r2r]N)r˜r�)rœs r r�r�<ss€õ !Ñ "Ô "€Eà ð&��q”˜R’� E¨"¤I¨b¤M°TÒ$9Ð$9Ø ˆbˆ ˆ Œ �Tш ˆ ‰ ݘuÑ%Ô%Ð%Ð%Ð%ð&ð&��Ð$9Ð$9rcó8‡—t¦«}tjdtj›dtj|¦«›d�¦«Šˆfd„|D¦«}t |¦«t |¦«krdSt|¦«|rt|¬¦«dSdS)af Remove mount points matching given path from cagefs.mp file :param str path: Path that should be removed from file. :param bool remount_cagefs: Remount cagefs skeleton or not :param remount_in_background: If True, cagefs remount will be done in separate background process, without waiting for completion :return: Nothing z^[z]?z(,\d+)?$có>•—g|]}‰ |¦«°|‘ŒSr)Úmatch)r…Úliner–s €r r‰z+remove_mount_dir_cagefs..Ss(ø€ÐLÐLÐL¨¸a¿gºgÀd¹m¼mÐL ÐLÐLÐLrNrŒ) r˜ÚreÚcompilerrRÚescapeÚlenr�r~)r3r�r|rœÚlines_with_excluded_pathr–s @r Úremove_mount_dir_cagefsr¨Gsµø€õ !Ñ "Ô "€Eå Œ ÐN�Ô1ÐNÐNµR´Y¸t±_´_ÐNÐNÐNÑOÔO€AØLÐLÐLÐL°ÐLÑLÔLÐõ ˆ5�z„z•SÐ1Ñ2Ô2Ò2Ð2؈åÐ3Ñ4Ô4Ð4ØðEÝÐ.CÐDÑDÔDÐDÐDÐDðEðErr3ÚreturncóÈ—tdd¬¦«5}|D]4}| d¬¦«}|d}||krddd¦«dSŒ5 ddd¦«n #1swxYwYd S) zACheck the fact that directory is mounted i.e. listed in mountinfoz/proc/self/mountinfor€r�é)ÚmaxsplitéNTF)rerL)r3Úmountinfo_filer¢Úmountinfo_entry_partsÚ mount_points r Ú_is_directory_mountedr±^sÞ€å Ð$¨wÐ 7Ñ 7Ô 7ð¸>Ø"ð ð ˆDØ$(§J¢J¸ JÑ$:Ô$:Ð !ð0°Ô2ˆKؘdÒ"Ð"Øðððñôðððð #ð  ðððñôððððððøøøððððð ˆ5s’*AÁ AÁAÁAcóº—tt¦«}|sDtj t¦«r t  dt¦«|S)a{Recommended way to check whether process is running inside CageFS Please avoid testing for /var/.cagefs existence. Replace with this function call when possible. Cached for the life of the process (CLOS-6868). Whether *this* process runs inside CageFS is fixed at exec time and cannot change afterwards, so the answer is stable; `in_cagefs.cache_clear()` is there for tests. Recomputing it re-parsed the whole of /proc/self/mountinfo, which on a host with thousands of CageFS users is a long file: `lvectl apply all` called this 7,350 times and spent 2.1 s of CPU doing nothing but re-reading it. z+%s should not exist in the real file system)r±ÚCAGEFS_DIR_PATHrXr3ÚisdirÚloggerÚwarning)Ú in_cagefs_s r Ú in_cagefsr¸ksK€õ'¥Ñ7Ô7€JØ ðW�"œ'Ÿ-š-­Ñ8Ô8ðWÝ�ŠÐDÅoÑVÔVÐVØ Ðrcóv— tj dd¦«}|€dStj |¦«}|j |¦«n#t ttf$rYdSwxYw |  |¦«sdSn"#t$r}td¦«|‚d}~wwxYwdS)z, Check that cagefs enabled for user Ú cagefsctlz/usr/share/cagefs/cagefsctl.pyNFz;ERROR: CageFS version is unsupported. Please update CageFS.T) Ú importlibÚutilÚspec_from_file_locationÚmodule_from_specÚloaderÚ exec_moduleÚ ImportErrorriÚOSErrorÚis_user_enabledÚAttributeErrorr)r{Ú_specrºÚes r Ú_is_cagefs_enabledrÇsê€ð Ý”×6Ò6Ø Ð9ñ ô ˆð ˆ=Ø�5Ý”N×3Ò3°EÑ:Ô:ˆ Ø Œ × Ò  Ñ+Ô+Ð+Ð+øÝ Õ*­GÐ 4ððð؈uˆuðøøøðlØ×(Ò(¨Ñ.Ô.ð Ø�5ð øå ðlðlðlÝ%Ð&cÑdÔdÐjkÐkøøøøðløøøð ˆ4s.‚"A ¦9A Á A;Á:A;Á?B B6Â!B1Â1B6)r )rcNNr6)NrcNNr FF)FF)!Úimportlib.utilr»ÚloggingrXr£rwÚ functoolsrrrZÚCAGEFS_SKELETON_PATHr³Ú getLoggerrrµrrrrr[rbrqr~r”r˜r�r�r¨ÚstrÚboolr±r¸rÇrrr úrÏs#ððÐÐÐØ€€€Ø € € € Ø € € € ØÐÐÐØÐÐÐÐÐà,ÐØ&€Ø3ÐØ €à ˆÔ ˜8Ñ $Ô $€ððððð�yñôðð*ð*ð*ð*ð*˜iñ*ô*ð*ð\ð\ð\ð\ð\ñ\ô\ð\ð~*ð*ð*ðJðJðJðJð(ðððð2 ð ð ð ð2Ø Ø Ø Ø ØØð]Cð]Cð]Cð]Cð@ððð #ð#ð#ð &ð&ð&ðEðEðEðEð.  ð ¨ð ð ð ð ðð�4ðððñ„ðð&ððððr