HEX
Server: Apache
System: Linux 185.122.168.184.host.secureserver.net 5.14.0-570.60.1.el9_6.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Nov 5 05:00:59 EST 2025 x86_64
User: barbeatleanalyti (1024)
PHP: 8.1.33
Disabled: NONE
Upload Files
File: //usr/lib/python3.9/site-packages/cockpit/channels/__pycache__/filesystem.cpython-39.opt-1.pyc
a

�/�h�V�@s�ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
mZddlmZmZmZddlmZmZddlmZddlmZddlmZmZmZm Z dd	l!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*e�+e,�Z-e�.�e/d
�dd��Z0e1d
�d
d�Z2dd
�dd�Z3dd
�dd�Z4Gdd�de�Z5Gdd�de �Z6Gdd�de�Z7Gdd�dee�Z8Gdd�dej9�Z:Gdd�dee�Z;dS) �N)�Path)�Callable�	Generator�Iterable)�Handle�	PathWatch)�Event)�Listener�)�AsyncChannel�Channel�ChannelError�GeneratorChannel)	�JsonDict�JsonDocument�	JsonError�
JsonObject�get_bool�get_int�get_str�get_strv�json_merge_and_filter_patch��returncCs0t�dtd���tj�}|r,t|�d�d�p.dS)Nz^Umask:\s*0([0-7]*)$z/proc/self/status���?)�re�searchr�	read_text�M�int�group)�match�r$�?/usr/lib/python3.9/site-packages/cockpit/channels/filesystem.py�my_umask6sr&c
Cs.d|j�d|j�d|jd�d|j�d|j��
S)Nz1:�-�o)�st_ino�st_mtime�st_mode�st_uid�st_gid��bufr$r$r%�
tag_from_stat<sr0�
str | NonecCs<ztt�|��WSty$YdSty6YdS0dS)Nr')r0�os�stat�FileNotFoundError�OSError)�pathr$r$r%�
tag_from_path@sr7cCs*ztt�|��WSty$YdS0dS�N)r0r2�fstatr5)�fdr$r$r%�tag_from_fdIsr;c@s eZdZdZdd�Zdd�ZdS)�
FsListChannelZfslist1cCsD|��rd}n |��rd}n|��r*d}nd}|j||j|d�dS)N�link�file�	directoryZspecial)�eventr6�type)�
is_symlink�is_file�is_dir�	send_json�name)�selfr@�entry�moder$r$r%�
send_entryUszFsListChannel.send_entryc
Cs|�d�}|�dd�}|r&tddd��zt�|�}Wn�tyj}ztdt|�d�|�WYd}~nrd}~0ty�}ztdt|�d�|�WYd}~n>d}~0ty�}ztd	t|�d�|�WYd}~n
d}~00|��|D]}|�	d
|�q�|�s|�
�|��dS)Nr6�watchTz
not-supportedz)watching is not implemented, use fswatch1��message�	not-found�
access-denied�internal-errorZpresent)�getr
r2�scandirr4�str�PermissionErrorr5�readyrJ�done�close)rG�optionsr6rKZscan_dir�errorrHr$r$r%�do_openas$
&&(zFsListChannel.do_openN)�__name__�
__module__�__qualname__�payloadrJrZr$r$r$r%r<Rsr<c@s*eZdZdZeeedefd�dd�ZdS)�
FsReadChannelZfsread1N�rXrc
cs~t|d�}t|dd�}t�d|�z�t|d���}t�|���}|durX|j|krXt	d��|j
rzt�|j�rz|j
|jd�n|�
�|�tj�}|dkr�q�t�dt|��|j
s�|�d	d�jd
d���}|Vq�Wd�n1s�0Ydt|�iWSt�ydd
iYSt�yB}zt	d�|�WYd}~n@d}~0t�yx}zt	dt|�d�|�WYd}~n
d}~00dS)Nr6�
max_read_sizezOpening file "%s" for reading�rbz	too-large)Z	size_hint�z  ...sending %d bytes��ignore��errors�tagr'rOrPrL)rr�logger�debug�openr2r3�fileno�st_sizer
Z	is_binary�S_ISREGr+rU�read1rZ
BLOCK_SIZE�len�replace�decode�encoder0r4rTr5rS)rGrXr6raZfilepr/�data�excr$r$r%�
do_yield_data}s2
&zFsReadChannel.do_yield_data)r[r\r]r^rr�bytesrvr$r$r$r%r_zsr_c@sHeZdZdZeded�dd�Zeddddd�d	d
�Zeed�dd
�ZdS)�FsReplaceChannelZ
fsreplace1r1)r6rhrcCsT|dur|t|�krtd��t�t��t�|�Wd�n1sF0YdS)N�change-conflictr')r7r
�
contextlib�suppressr4r2�unlink)rGr6rhr$r$r%�delete�s
(zFsReplaceChannel.delete�bytes | None�
int | None)r6rhrt�sizerc
�svtj�|�\}}tj|d|�d�d�\}}�z |durht�d||�|r`|�tj|d|�IdH|�	�d}	|dur�|�tj
||�IdH|	t|�7}	|��IdH}ql|dur�|	|kr�t�d||	�|�tj
||	�IdH|�tj|�IdH|du�r t�|dt�@�t�||�d}�n|dk�rLt�|dt�@�t�||�n�t�|tj�}
z�t�|
�}|t|�k�r|td��t�|t�|j��t�||j|j�z,t�|
d	�}t�|d	|�t�d
||�Wn2t�y}
zt� d|
�WYd}
~
n
d}
~
00Wt�!|
�nt�!|
�0t�||�d}Wt�!|�|du�rnt�"|�n t�!|�|du�rlt�"|�0t#|�S)N�.r')�dir�prefixzfallocate(%s.tmp, %d)rzftruncate(%s.tmp, %d)i�ryzsecurity.selinuxz SELinux context '%s' set on '%s'zAError getting or setting SELinux context from original file: '%s')$r2r6�split�tempfileZmkstemprirjZ	in_thread�posix_fallocaterU�writerp�read�	ftruncate�	fdatasync�fchmodr&�renamer=rk�O_RDONLYr3r0r
�S_IMODEr+�fchownr,r-�getxattr�setxattrr5�	exceptionrWr|r7)rGr6rhrtr��dirname�basenamer:ZtmpnameZwrittenZpath_fdr/Zselinux_contextrur$r$r%�set_contents�s^


$

�

zFsReplaceChannel.set_contentsr`c
�s�t|d�}t|dd�}t|dd�}zt|durD|�||d|�IdH}nB|��|��IdH}|durp|�||�}n|�|||d�IdH}|��d|iWSty�}ztd�|�WYd}~n�d}~0t	y�}ztd�|�WYd}~n�d}~0t
�y}ztd�|�WYd}~nvd}~0t�yT}ztdt|�d�|�WYd}~n@d}~0t
�y�}ztd	t|�d�|�WYd}~n
d}~00dS)
Nr6r�rhrcrNryrOrLrP)rrr�rUr�r}rVr4r
�FileExistsErrorrT�IsADirectoryErrorrSr5)rGrXr6r�rhrtrur$r$r%�run�s.

&zFsReplaceChannel.runN)	r[r\r]r^rSr}r�rr�r$r$r$r%rx�s�Crxc@s~eZdZUdZdZded<dZdZee	dd�dd	��Z
e	ed
dd�dd
�Zdddd�dd�Z
edd�dd�Zdd�dd�ZdS)�FsWatchChannelZfswatch1Nr1�_tagFztuple[str, str | None])�maskrcCsltjp
tj|vr&dtj|vr dndfStj|vsDtj|vsDtj|vrHdStj|vrVdStj|vrddSdSdS)N�createdr?r>)�deletedN)zattribute-changedN)z	done-hintN)ZchangedN)	�InotifyEvent�CREATE�MOVED_TOZISDIR�
MOVED_FROM�DELETEZDELETE_SELFZATTRIBZCLOSE_WRITE)r�r$r$r%�mask_to_event_and_type s

z%FsWatchChannel.mask_to_event_and_typer~)r��_cookierFrcCs�t�d|j||�|�|�\}}|rTtj�|j|���}t|�}|j	||||d�n4t|j�}||j
krldS||_
|j	||j|j
|d�dS)Nz%do_inotify_event(%s): mask %X name %s)r@r6rhrA)rirj�_pathr�r2r6�joinrrr7rEr�)rGr�r�rFr@�type_r6rhr$r$r%�do_inotify_event-s

zFsWatchChannel.do_inotify_eventr�r:�errrcCsNt�d|jt|�|�|r"t|�nd|_|jrJ|j|r:dnd|j|jd�dS)Nz&do_identity_changed(%s): fd %s, err %sr'r�r�)r@r6rh)rirjr�rSr;r��_activerE�rGr:r�r$r$r%�do_identity_changed=sz"FsWatchChannel.do_identity_changedr`cCs8t|d�|_d|_d|_t|j|�|_d|_|��dS)Nr6FT)rr�r�r�r�_watchrU)rGrXr$r$r%rZCszFsWatchChannel.do_openrcCs&|jdur|j��d|_|��dSr8)r�rW�rGr$r$r%�do_closeMs

zFsWatchChannel.do_close)r[r\r]r^r��__annotations__r�r��staticmethodr�r�r!r�r�rrZr�r$r$r$r%r�s

r�c@seZdZdZdZdS)�FollowFTN)r[r\r]�NO�YESr$r$r$r%r�Tsr�c@sleZdZUdZeed<ded<eed<eed<eed<eed<eed	<d
Zeed<dZ	d
ed<dZ
ded<dZded<ded<ee
edd�dd��Zdd�eedd�dd�Zdd�dedd�dd�Zdd �d!d"�Zeed#�d$d%�Zedd#�d&d'�Zedd(�d)d*�Zeed+�d,d-�Zedd+�d.d/�Zeed0dd1�d2d3�Zd
d4dd5�d6d7�Zdd �d8d9�Zedd:�d;d<�ZdS)=�
FsInfoChannelZfsinfor6zset[str]�attrs�fnmatch�targets�followrK�
current_value��effective_fnmatchNz
Handle | Noner:zset[str] | None�pendingzPathWatch | None�
path_watchz*Callable[[int, str, Follow], JsonDocument]�getattrsz1Callable[[int, str, Follow], JsonDocument | None])r�rcs�t��tdd�dd���t��tdd�dd���tjdtjd	tjd
tjdtjdtj	d
tj
di��fdd�tdd�dd�dd�dd�dd��fdd��fdd�d�	�t�fdd�|D���tt
tdd��fdd�}|S)Nz	str | int)�uidrcSs*zt�|�jWSty$|YS0dSr8)�pwd�getpwuid�pw_name�KeyError)r�r$r$r%�get_userosz-FsInfoChannel.make_getattrs.<locals>.get_user)�gidrcSs*zt�|�jWSty$|YS0dSr8)�grp�getgrgid�gr_namer�)r�r$r$r%�	get_groupvsz.FsInfoChannel.make_getattrs.<locals>.get_groupZregr�Zlnk�chrZblkZfifoZsockcs��t�|j��Sr8)rQr3�S_IFMTr+r.)�
stat_typesr$r%�<lambda>�rcz-FsInfoChannel.make_getattrs.<locals>.<lambda>cSst�|j�Sr8)r3r�r+r.r$r$r%r��rccSs|jSr8)rmr.r$r$r%r��rccSs|jSr8�r,r.r$r$r%r��rccSs|jSr8�r-r.r$r$r%r��rccSs|jSr8)r*r.r$r$r%r��rccs
�|j�Sr8r�r.)r�r$r%r��rccs
�|j�Sr8r�r.)r�r$r%r��rc)	rArhrIr�r�r��mtime�userr"c3s"|]}|��|dd��fVqdS)cSsdSr8r$)�_r$r$r%r��rcz7FsInfoChannel.make_getattrs.<locals>.<genexpr>.<lambda>N)rQ)�.0�key)�available_stat_gettersr$r%�	<genexpr>�rcz.FsInfoChannel.make_getattrs.<locals>.<genexpr>zJsonDict | None)r:rFr�rcs�z$|rtj||j|d�nt�|��Wn2ty8YdStyVdd��D�YS0�fdd��D�}d|vr�t��j�tjkr�t	�
t��"tj||d�|d<Wd�n1s�0Y|S)N)�follow_symlinks�dir_fdcSsi|]\}}|d�qSr8r$)r�rF�funcr$r$r%�
<dictcomp>�rczBFsInfoChannel.make_getattrs.<locals>.get_attrs.<locals>.<dictcomp>csi|]\}}||���qSr$r$)r�r�r�r.r$r%r��rc�target)r�)r2r3�valuer9r4r5r�r+�S_IFLNKrzr{�readlink)r:rFr��result)�stat_gettersr.r%�	get_attrs�s$0z.FsInfoChannel.make_getattrs.<locals>.get_attrs)�	functools�	lru_cacher!r3�S_IFREG�S_IFDIRr��S_IFCHR�S_IFBLK�S_IFIFO�S_IFSOCKr0�tuplerSr�)r�r�r$)r�r�r�r�r�r%�
make_getattrsls(�


�zFsInfoChannel.make_getattrsF��reset)�updatesr�rcCst|rVt|j�t|�@rD|jt�|j�dd�ddi|_|jdd�n|�t�|j��t|j|�|rp|�|�dS)NT)�partialr�)�setr�rE�dict�fromkeys�updater)rGr�r�r$r$r%�send_update�s
zFsInfoChannel.send_updatecs��fdd�|D�}|�di�}�jr,||d<�jr�i|d<}dd�|��D�D]F}t|t�rP|dkrP|d	ks�d
|vs���|�sP���j|t	j
�||<qP�jd|i|d�dS)
Ncs i|]}|���j|tj��qSr$)r�r:r�r�)r�rFr�r$r%r��rcz0FsInfoChannel.process_update.<locals>.<dictcomp>r��entriesr�cSs h|]}t|t�r|�d��qS)r�)�
isinstancer�rQ�r��er$r$r%�	<setcomp>�rcz/FsInfoChannel.process_update.<locals>.<setcomp>r�z..�/�infor�)�popr�r��valuesr�rS�interestingr�r:r�r�r�)rGr�r�r�r�r�rFr$r�r%�process_update�szFsInfoChannel.process_updatercCs|jr|�|j�d|_dSr8)r�rr�r$r$r%�process_pending_updates�sz%FsInfoChannel.process_pending_updates)rFrcCs|dkrdSt�||j�SdS)Nr�T)r�r��rGrFr$r$r%r�szFsInfoChannel.interestingcCsB|�|�sdS|jdur2t���d|j�t�|_|j�|�dS)Ng�������?)rr��asyncioZget_running_loopZ
call_laterrr��addrr$r$r%�schedule_update�s

zFsInfoChannel.schedule_update)r�rcCsd|tjkrd}n*|tjtjfvr&d}n|tjkr6d}nd}|jd|t�|�tj|d�idd�dS)	NrNrOz
not-directoryrPrY)�problemrM�errnoTr�)	r�ENOENT�EPERMZEACCES�ENOTDIRr�r2�strerror�	errorcode)rGr�rr$r$r%�report_error�s

��zFsInfoChannel.report_error)r:rcCsF|jr|j�d�sdSt�|�}t�|j�tjkrB|�	t
j�dSdS)Nr�FT)rKr6�endswithr2r9r3r�r+r�rrr)rGr:r/r$r$r%�flag_onlydir_error�s
z FsInfoChannel.flag_onlydir_errorcs~��|�rdS|�_dh}�jr^z$|�t�d�j�����j�_Wnty\d�_Yn0�j�fdd�|D�dd�dS)Nr�z/proc/self/fd/csh|]}��|�r|�qSr$)rr�r�r$r%r�
rcz5FsInfoChannel.report_initial_state.<locals>.<setcomp>Tr�)	rr:r�r�r2�listdirr�r5r)rGr:r�r$r�r%�report_initial_state�s
z"FsInfoChannel.report_initial_stater~)r��cookie�rawnamercCsXt�d|||�|pdjdd�}|�|�|rT|tjtjBtjBtjBBrT|�d�dS)Nzdo_inotify_event(%r, %r, %r)rc�surrogateescaperfr�)	rirjrrrr�r�r�r�r�)rGr�rrrFr$r$r%r�s
��zFsInfoChannel.do_inotify_eventrr�cCsDt�d||�|jdur"|j��|dur6|�|�n
|�|�dS)Nzdo_identity_changed(%r, %r))rirjr��clearrrr�r$r$r%r�s

z!FsInfoChannel.do_identity_changedcCs|j��|��dSr8)r�rWr�r$r$r%r�$s
zFsInfoChannel.do_closer`c
Cs\t|d�|_tj�|j�s$t|d��tt|d��}|�|ddh�|_t|dd|vrXdnd�|_	d|v|_
t|d	d
d�|_t|dd
d�|_
|j
r�|js�t|d��|j
r�|js�t|d��i|_|��|j
�sJz&t�|j|jr�tjn
tjtjB�}Wn2t�y$}z|�|j�WYd}~nd}~00|�|�|��|��|��nt|j|�|_dS)Nr6z"path" must be an absolute pathr�r�r�r��*r�r�T)�defaultrKFz>"watch: true" and "follow: false" are (currently) incompatiblezB`targets: "stat"` and `follow: false` are (currently) incompatible)rr6r2�isabsrr�rr�r�r�r�rr�rKr�rUrrk�O_PATH�
O_NOFOLLOWr5rrrrWrVrr�)rGrXr�r:rur$r$r%rZ*s2



&"

zFsInfoChannel.do_open)r[r\r]r^rSr��boolrr�r:r�r�r�rr�r�rrrrr!rrrrr�r�r�r�rrZr$r$r$r%r�Ys6
1

r�)<rrz�enumrr�r�r�Zloggingr2r�rr3r��pathlibr�typingrrrZcockpit._vendor.systemd_ctypesrrZ&cockpit._vendor.systemd_ctypes.inotifyrr�Z(cockpit._vendor.systemd_ctypes.pathwatchr	ZPathWatchListenerZchannelrrr
rZjsonutilrrrrrrrrrZ	getLoggerr[rir�r!r&rSr0r7r;r<r_rxr��Enumr�r�r$r$r$r%�<module>s>,
		((s?