
    h`                     L   S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKrS SKrS SKJr  S SKJrJrJr  S SKJrJr  S SKJr  S SKJr  SSKJrJrJrJ r   SS	K!J"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,  \RZ                  " \.5      r/\R`                  " 5       S
\14S j5       r2S\Rf                  S
\44S jr5S S jr6S\1S
S4S jr7 " S S\5      r8 " S S\ 5      r9 " S S5      r: " S S\5      r; " S S\\5      r< " S S\Rz                  5      r> " S S\\5      r?g)!    N)Path)Callable	GeneratorIterable)Handle	PathWatch)Event)Listener   )AsyncChannelChannelChannelErrorGeneratorChannel)JsonDictJsonDocument	JsonError
JsonObjectget_boolget_int
get_objectget_strget_str_or_intget_strvjson_merge_and_filter_patchreturnc                      [         R                  " S[        S5      R                  5       [         R                  5      n U =(       a    [        U R                  S5      S5      =(       d    S$ )Nz^Umask:\s*0([0-7]*)$z/proc/self/status      ?   )researchr   	read_textMintgroup)matchs    =/usr/lib/python3/dist-packages/cockpit/channels/filesystem.pymy_umaskr(   8   sJ    II-t4G/H/R/R/TVXVZVZ[E,c%++a.!,66    bufc           
          SU R                    SU R                   SU R                  S SU R                   SU R                   3
$ )Nz1:-o)st_inost_mtimest_modest_uidst_gidr*   s    r'   tag_from_statr4   >   s=    

|1S\\N!CKK?!CJJ<qUUr)   
str | Nonec                 x     [        [        R                  " U 5      5      $ ! [         a     g[         a     g f = f)Nr,   )r4   osstatFileNotFoundErrorOSError)paths    r'   tag_from_pathr<   B   s7    RWWT]++  s   ! 
9	99fdc                 b     [        [        R                  " U 5      5      $ ! [         a     g f = fN)r4   r7   fstatr:   )r=   s    r'   tag_from_fdrA   K   s,    RXXb\** s   ! 
..c                   8    \ rS rSrSrS\SSSS4S jrSS	 jrS
rg)FsListChannelT   fslist1evententryzos.DirEntry[str]r   Nc                     UR                  5       (       a  SnO2UR                  5       (       a  SnOUR                  5       (       a  SnOSnU R                  XR                  US9  g )Nlinkfile	directoryspecial)rF   r;   type)
is_symlinkis_fileis_dir	send_jsonname)selfrF   rG   modes       r'   
send_entryFsListChannel.send_entryW   sO    D]]__D\\^^DDU$?r)   c                    [        US5      nUR                  SS5      nU(       a
  [        SSS9e [        R                  " U5      nU R                  5         U H  nU R                  S
U5        M     U(       d!  U R                  5         U R                  5         g g ! [
         a  n[        S[        U5      S9UeS nAf[         a  n[        S[        U5      S9UeS nAf[         a  n[        S	[        U5      S9UeS nAff = f)Nr;   watchTznot-supportedz)watching is not implemented, use fswatch1message	not-foundaccess-deniedinternal-errorpresent)r   getr   r7   scandirr9   strPermissionErrorr:   readyrU   doneclose)rS   optionsr;   rX   scan_direrrorrG   s          r'   do_openFsListChannel.do_openc   s    w'GT*8cdd	Pzz$'H 	

EOOIu-  IIKJJL  ! 	K{CJ?UJ 	OE
CN 	P/UD%O	Ps/   B 
D %B99D CD 'C;;D  )rf   r   r   N)	__name__
__module____qualname____firstlineno__payloadra   rU   ri   __static_attributes__rk   r)   r'   rC   rC   T   s+    G
@ 
@,> 
@4 
@r)   rC   c                   6    \ rS rSrSrS\S\\S\4   4S jrSr	g)FsReadChannel|   fsread1rf   r   Nc              #     #    [        US5      n[        USS5      n[        R                  SU5         [	        US5       n[
        R                  " UR                  5       5      nUS:w  a  UR                  U:  a  [        S5      eU R                  (       a?  [        R                  " UR                  5      (       a  U R                  UR                  S9  OU R                  5          UR                  [        R                   5      nUS	:X  a  Oc[        R                  S
[#        U5      5        U R                  (       d-  UR%                  SS	5      R'                  SS9R)                  5       nUv   M  S S S 5        S[+        W5      0$ ! , (       d  f       N= f! [,         a    SS0s $ [.         a  n[        S5      UeS nAf[0         a  n[        S[3        U5      S9UeS nAff = f7f)Nr;   max_read_sizei   zOpening file "%s" for readingrbz	too-large)	size_hintr)   z  ...sending %d bytes    ignoreerrorstagr,   r\   r]   rY   )r   r   loggerdebugopenr7   r8   filenost_sizer   	is_binaryS_ISREGr0   rc   read1r   
BLOCK_SIZElenreplacedecodeencoder4   r9   rb   r:   ra   )rS   rf   r;   rw   filepr*   dataexcs           r'   do_yield_dataFsReadChannel.do_yield_data   s    w':JK4d;	LdD!Uggelln- B&3;;+F&{33>>dll3;;&?&?JJJ5JJL ;;w'9'9:Ds{LL!8#d)D>>#||E37>>h>OVVXJ  "& =-..' "!* ! 	 3< 	9/S8 	L/SBK	LsX   0G#F D0F/F G#
FF G #G#%	G .F::G GG  G#rk   )
rl   rm   rn   ro   rp   r   r   bytesr   rq   rk   r)   r'   rs   rs   |   s)    G"LZ "LIeT:>U4V "Lr)   rs   c                   Z    \ rS rSr% SrS\S'   SrS\S'   1 SkrSrS\S'   S\	S	S4S
 jr
Srg)FSReplaceAttrs   N
int | Noneuidgid>   rT   userr%   rT   valuer   c                    UR                  5       U R                  -
  nU(       a'  [        SSSR                  U5       3[	        U5      S9S e[        USS 5      U l        [        USS 5      n[        USS 5      nUb  Uc
  [        SSS	9eUb  Uc
  [        SS
S	9e[        U[        5      (       a'   [        R                  " U5      R                  U l        OX0l        [        U[        5      (       a'   [        R                   " U5      R"                  U l        g X@l        g ! [         a    [        SSU 3S	9S ef = f! [         a    [        SSU 3S	9S ef = f)Nzprotocol-errorz%"attrs" contains unsupported key(s): ,)rZ   unsupported_attrsrT   r   r%   z3"group" attribute is empty while "user" is providedrY   z3"user" attribute is empty while "group" is providedr[   zuid not found for zgid not found for )keyssupported_attrsr   joinlistr   rT   r   
isinstancera   pwdgetpwnampw_uidr   KeyErrorgrpgetgrnamgr_gidr   )rS   r   r   r   r%   s        r'   __init__FSReplaceAttrs.__init__   sd   !JJL4+?+??/)NsxxXiOjNk'l156G1HJOST E640	eVT2ugt4/9noo/9noodC  _<<-44 HeS!!`<<.55 H  _";:LTF8STZ^^_  `";:LUG8TU[__`s   .%D 0%D9 D69E)r   rT   r   )rl   rm   rn   ro   r   __annotations__r   r   rT   r   r   rq   rk   r)   r'   r   r      s8    CC/OD,j T r)   r   c                   f    \ rS rSrSrSrS\SSS\4S jrS\SSS	S
SSSSSS4S jrS\	S\	4S jr
Srg)FsReplaceChannel   
fsreplace1)attrsr;   r   r5   r   c                     Ub  U[        U5      :w  a  [        S5      e[        R                  " [        5         [
        R                  " U5        S S S 5        g! , (       d  f       g= f)Nchange-conflictr,   )r<   r   
contextlibsuppressr9   r7   unlink)rS   r;   r   s      r'   deleteFsReplaceChannel.delete   sM    ?smD&99011  !23IIdO 4 43s   A
A&r   bytes | Nonesizer   r   zFSReplaceAttrs | Nonec                    ^#    [         R                  R                  U5      u  pg[        R                  " USU S3S9u  pSSU4S jjjn
SSU4S jjjn UbW  [
        R                  SX5        U(       a*  U R                  [         R                  USU5      I S h  vN   U R                  5         SnUbS  U R                  [         R                  X5      I S h  vN   U[        U5      -  nU R                  5       I S h  vN nUb  MS  UbC  X:  a>  [
        R                  SX5        U R                  [         R                  X5      I S h  vN   U R                  [         R                  U5      I S h  vN   Uc*  U" U5        U
" U5        [         R                  " X5        S n	GO&US:X  a'  U" U5        U
" U5        [         R                   " X5        O[         R"                  " U[         R$                  5      n [         R&                  " U5      nU[)        U5      :w  a  [+        S	5      eU" U[&        R,                  " UR.                  5      5        U
" X5         [         R0                  " US
5      n[         R2                  " US
U5        [
        R                  SX5        [         R8                  " U5        [         R                  " X5        S n	[         R8                  " U5        U	b  [         R:                  " U	5        [=        U5      $  GNh GN. GN GN GN! [4         a   n[
        R7                  SU5         S nANS nAff = f! [         R8                  " U5        f = f! [         R8                  " U5        U	b  [         R:                  " U	5        f f = f7f)N.r,   )dirprefixc                    > TbG  TR                   b:  TR                  b-  [        R                  " U TR                   TR                  5        g Ub,  [        R                  " XR                  UR
                  5        g g r?   )r   r   r7   fchownr1   r2   )r=   r*   r   s     r'   chown_if_required8FsReplaceChannel.set_contents.<locals>.chown_if_required   sS     UYY%:uyy?T		"eii3		"jj#**5 !r)   c                    > Tb  TR                   b  TR                   nOUc  S[        5       ) -  n[        R                  " X5        g )Ni  )rT   r(   r7   fchmod)r=   rT   r   s     r'   apply_file_mode6FsReplaceChannel.set_contents.<locals>.apply_file_mode   s:     UZZ%;zz
{*IIbr)   zfallocate(%s.tmp, %d)r   zftruncate(%s.tmp, %d)r   zsecurity.selinuxz SELinux context '%s' set on '%s'zAError getting or setting SELinux context from original file: '%s'r?   )r=   r$   r*   zos.stat_result | None)r=   r$   rT   r   )r7   r;   splittempfilemkstempr   r   	in_threadposix_fallocaterc   writer   read	ftruncate	fdatasyncrenamerI   r   O_RDONLYr8   r4   r   S_IMODEr0   getxattrsetxattrr:   	exceptionre   r   r<   )rS   r;   r   r   r   r   dirnamebasenamer=   tmpnamer   r   writtenpath_fdr*   selinux_contextr   s        `           r'   set_contentsFsReplaceChannel.set_contents   s     GGMM$/&&7Qxj?K	6 	6	  	 ;	#4dA..););RDIII

G"nnRXXr8883t9$!YY[( "
 GN4dDnnR\\2???..r222{  #!"%		'(#!"%& ''$4&'''*CmC00*+<==#BS[[(AB%b.s*,++g?Q*RB(:OL%G_ HHW%		'( HHRL"		'"T""s J
 9( @2> # s(()lnqrrs HHW% HHRL"		'" #s   ANAM L<M L%M =L>M AM L	'M 0L1BM 5AL> AL .M :NM M M M M 
L;L61L> 6L;;L> >MM 2NNrf   c                   #    [        US[        S 5      n[        US5      n[        USS 5      n[        USS 5      n Ub  U R	                  X5SXB5      I S h  vN nOYU R                  5         U R                  5       I S h  vN nUc  U R                  X55      nOU R	                  X5US U5      I S h  vN nU R                  5         SU0$  Nr NK N! [         a  n[        S5      UeS nAf[         a  n[        S5      UeS nAf[         a  n[        S5      UeS nAf[         a  n[        S[        U5      S	9UeS nAf[         a  n[        S
[        U5      S	9UeS nAff = f7f)Nr   r;   r   r   r)   r[   r   r\   rY   r]   )r   r   r   r   r   rc   r   r   rd   r9   r   FileExistsErrorrb   IsADirectoryErrorra   r:   )rS   rf   r   r;   r   r   r   r   s           r'   runFsReplaceChannel.run,  sP    7G^TBw'w-gud+	L
  --ddJJ

!YY[(<++d0C $ 1 1$T4 OOCIIK3< K )
 P
 ! 	5{+4 	;01s: 	9/S8  	KCAsJ 	L/SBK	Ls   9E C C(C >C
?0C /C0C E C 
C C 
EC$$E1C==E
DE#D77EEEE rk   N)rl   rm   rn   ro   rp   capabilitiesra   r   r   r   r   rq   rk   r)   r'   r   r      s{    GL3 \ c S#S#*S#2@S#HTS#&S# 
S#j$L $L
 $Lr)   r   c                       \ rS rSr% SrSrS\S'   SrSr\	S\
SS	4S
 j5       rS\
S\SSSS4S jrSS jrS\SS4S jrSS jrSrg)FsWatchChanneliS  fswatch1Nr5   _tagFmaskr   ztuple[str, str | None]c                 ^   [         R                  =(       d    [         R                  U ;   a  S[         R                  U ;   a  S4$ S4$ [         R                  U ;   d(  [         R
                  U ;   d  [         R                  U ;   a  g[         R                  U ;   a  g[         R                  U ;   a  gg)NcreatedrK   rJ   )deletedN)zattribute-changedN)z	done-hintN)changedN)	InotifyEventCREATEMOVED_TOISDIR
MOVED_FROMDELETEDELETE_SELFATTRIBCLOSE_WRITE)r   s    r'   mask_to_event_and_type%FsWatchChannel.mask_to_event_and_type^  s    8<#8#8TA\-?-?4-GkSSVSS$$,0C0Ct0K|OgOgkoOo"  D(,%%-$"r)   _cookierR   r   c                    [         R                  SU R                  X5        U R                  U5      u  pEU(       aT  [        R
                  R                  U R                  UR                  5       5      n[        U5      nU R                  XFXuS9  g [        U R                  5      nXpR                  :X  a  g Xpl
        U R                  X@R                  U R                  US9  g )Nz%do_inotify_event(%s): mask %X name %s)rF   r;   r   rM   )r   r   _pathr   r7   r;   r   r   r<   rQ   r   )rS   r   r   rR   rF   type_r;   r   s           r'   do_inotify_eventFsWatchChannel.do_inotify_eventk  s    <djj$U224877<<

DKKM:D%CNNsNG  

+CiiINNZZTYYUNSr)   c                    [         R                  SU R                  [        U5      U5        U(       a  [	        U5      OSU l        U R                  (       a/  U R                  U(       a  SOSU R                  U R
                  S9  g g )Nz&do_identity_changed(%s): fd %s, err %sr,   r   r   )rF   r;   r   )r   r   r   ra   rA   r   _activerQ   rS   r=   errs      r'   do_identity_changed"FsWatchChannel.do_identity_changed{  sZ    =tzz3r7TWX')KOs	<<NNbidjjVZV_V_N` r)   rf   c                     [        US5      U l        S U l        SU l        [	        U R                  U 5      U l        SU l        U R                  5         g )Nr;   FT)r   r   r   r   r   _watchrc   )rS   rf   s     r'   ri   FsWatchChannel.do_open  s@    Wf-
	

D1

r)   c                     U R                   b!  U R                   R                  5         S U l         U R                  5         g r?   )r  re   rS   s    r'   do_closeFsWatchChannel.do_close  s,    ;;"KKDK

r)   )r   r   r   r  )r=   r   r  r   r   Nr   N)rl   rm   rn   ro   rp   r   r   r  r   staticmethodr   r   r$   r   r  r   ri   r	  rq   rk   r)   r'   r   r   S  s    GD,F G
#\ 
#6N 
# 
#T\ TC T~ TZ^ T az d r)   r   c                       \ rS rSrSrSrSrg)Followi  FTrk   N)rl   rm   rn   ro   NOYESrq   rk   r)   r'   r  r    s    	B
Cr)   r  c                      \ rS rSr% Sr\\S'   S\S'   \\S'   \\S'   \\S'   \\S	'   \\S
'   Sr	\\S'   Sr
S\S'   SrS\S'   SrS\S'   S\S'   \S\\   SS4S j5       rSS.S\S\SS4S jjrSS.SSS\SS4S jjrS1S jrS \S\4S! jrS \SS4S" jrS#\SS4S$ jrS\S\4S% jrS\SS4S& jrS'\S(\S)S*SS4S+ jrS2S, jrS1S- jrS.\SS4S/ jrS0r g)3FsInfoChanneli  fsinfor;   zset[str]r   fnmatchtargetsfollowrX   current_value effective_fnmatchNHandle | Noner=   zset[str] | NonependingzPathWatch | None
path_watchz*Callable[[int, str, Follow], JsonDocument]getattrsr   z1Callable[[int, str, Follow], JsonDocument | None]c                 ,  ^^^^^ [         R                  " 5       S[        SS4S j5       m[         R                  " 5       S[        SS4S j5       m[        R                  S[        R
                  S[        R                  S	[        R                  S
[        R                  S[        R                  S[        R                  S0mU4S j[        S S S S S U4S jU4S jS.	m[        U4S jU  5       5      mS[        S[        S[        SS4U4S jjnU$ )Nr   r   z	str | intc                 h     [         R                  " U 5      R                  $ ! [         a    U s $ f = fr?   )r   getpwuidpw_namer   )r   s    r'   get_user-FsInfoChannel.make_getattrs.<locals>.get_user  0    ||C(000 
   " 11r   c                 h     [         R                  " U 5      R                  $ ! [         a    U s $ f = fr?   )r   getgrgidgr_namer   )r   s    r'   	get_group.FsInfoChannel.make_getattrs.<locals>.get_group  r$  r%  regr   lnkchrblkfifosockc                 b   > TR                  [        R                  " U R                  5      5      $ r?   )r_   r8   S_IFMTr0   )r*   
stat_typess    r'   <lambda>-FsInfoChannel.make_getattrs.<locals>.<lambda>  s    
t{{3;;/G Hr)   c                 B    [         R                  " U R                  5      $ r?   )r8   r   r0   r3   s    r'   r4  r5    s    S[[ 9r)   c                     U R                   $ r?   )r   r3   s    r'   r4  r5    s    r)   c                     U R                   $ r?   r1   r3   s    r'   r4  r5        szzr)   c                     U R                   $ r?   r2   r3   s    r'   r4  r5    r:  r)   c                     U R                   $ r?   )r/   r3   s    r'   r4  r5    s    r)   c                 (   > T" U R                   5      $ r?   r9  )r*   r"  s    r'   r4  r5    s     4r)   c                 (   > T" U R                   5      $ r?   r<  )r*   r)  s    r'   r4  r5    s    3::!6r)   )	rM   r   rT   r   r   r   mtimer   r%   c              3   L   >#    U  H  oTR                  US  5      4v   M     g7f)c                     g r?   rk   )_s    r'   r4  7FsInfoChannel.make_getattrs.<locals>.<genexpr>.<lambda>  s    Tr)   N)r_   ).0keyavailable_stat_getterss     r'   	<genexpr>.FsInfoChannel.make_getattrs.<locals>.<genexpr>  s%     e_dX[#9#=#=c>#RS_ds   !$r=   rR   r  zJsonDict | Nonec                 F  >  U(       a  [         R                  " XR                  U S9O[         R                  " U 5      nT VVs0 s H  u  pTXT" U5      _M     nnnSU;   an  [        R                  " UR                  5      [        R                  :X  a<  [        R                  " [
        5         [         R                  " XS9US'   S S S 5        U$ U$ ! [         a     g [
         a"    T VVs0 s H  u  pUS _M
     Os  snnf snns $ f = fs  snnf ! , (       d  f       U$ = f)N)follow_symlinksdir_fdtarget)rL  )r7   r8   r   r@   r9   r:   r2  r0   S_IFLNKr   r   readlink)r=   rR   r  r*   funcrF  resultstat_getterss          r'   	get_attrs.FsInfoChannel.make_getattrs.<locals>.get_attrs  s    CPTbggdLLLZ\ZbZbceZf 7CClc49nlFC6!dkk#++&>$,,&N((1'){{4'CF8$ 2 M6M %  C5AB\ztd
\BBC D 21 Ms5   <C D-D
DD+C;:DD
D )	functools	lru_cacher$   r8   S_IFREGS_IFDIRrN  S_IFCHRS_IFBLKS_IFIFOS_IFSOCKr4   tuplera   r  )r   rS  rG  r)  r"  rR  r3  s     @@@@@r'   make_getattrsFsInfoChannel.make_getattrs  s    
				# 	+ 	 
	 
				3 	; 	 
	 llE4<<eUYUaUachllE4<<PVX
 I 9+))-46
"
 e_dee	# 	S 	& 	=N 	  r)   Fresetupdatesra  c                   U(       a  [        U R                  5      [        U5      -  (       aF  U R                  [        R	                  U R                  5      SS9  SS0U l        UR                  S S9  O.UR                  [        R	                  U R                  5      5        [        U R                  U5        U(       a  U R                  U5        g g )NT)partialrd  )setr  rQ   dictfromkeysupdater   )rS   rb  ra  s      r'   send_updateFsInfoChannel.send_update  s    4%%&W5t}}T-?-?@$O&/%6"t, t}}T-?-?@A#D$6$6@NN7# r)   c          	         U R                   c   eU Vs0 s H.  o3U R                  U R                   U[        R                  5      _M0     nnUR	                  S0 5      n[        U[        5      (       d   eU R                  (       a  XES'   U R                  (       a  0 =US'   nUR                  5        Vs1 s H+  n[        U[        5      (       d  M  UR                  S5      iM-     sn Hs  n[        U[        5      (       d  M  US:w  d  M"  US:X  d  SU;   d  U R                  U5      (       a  MF  U R                  U R                   U[        R                  5      Xc'   Mu     U R                  SU0US	9  g s  snf s  snf )
Nr  entriesr  rM  r   z../infor`  )r=   r  r  r  popr   rf  r  r  valuesr_   ra   interestingr  ri  )rS   rb  ra  rR   rl  rn  r  es           r'   process_updateFsInfoChannel.process_update  s3   ww"""W^_W^t4==$		#JJW^_{{2r"$%%%%!!%O<<(**DOg 3:..2BZ2BQjQRTXFYx2BZdC((TS[t4;K;KD;Q;Q(,dggtVZZ(P	 [ 	&$u5- `  [s   5E23E7E7c                     U R                   c   eU R                   (       a  U R                  U R                   5        S U l         g r?   )r  rs  r  s    r'   process_pending_updates%FsInfoChannel.process_pending_updates  s2    ||'''<<-r)   rR   c                 P    US:X  a  g[         R                   " XR                  5      $ )Nr  T)r  r  rS   rR   s     r'   rq  FsInfoChannel.interesting  s#    2: ??4)?)?@@r)   c                     U R                  U5      (       d  g U R                  c>  [        R                  " 5       R	                  SU R
                  5        [        5       U l        U R                  R                  U5        g )Ng?)rq  r  asyncioget_running_loop
call_laterrv  re  addry  s     r'   schedule_updateFsInfoChannel.schedule_update  sZ    %%<<$$&11#t7S7ST5DLr)   r  c                 (   U[         R                  :X  a  SnO@U[         R                  [         R                  4;   a  SnOU[         R                  :X  a  SnOSnU R                  SU[        R                  " U5      [         R                  U   S.0SS9  g )	Nr[   r\   znot-directoryr]   rh   )problemrZ   errnoTr`  )	r  ENOENTEPERMEACCESENOTDIRri  r7   strerror	errorcode)rS   r  r  s      r'   report_errorFsInfoChannel.report_error  s    %,,!GU[[%,,//%GEMM!%G&G'2;;s+;eooVYFZ$
  	 	r)   c                 8   U R                   (       a   U R                  R                  S5      (       d  g[        R                  " U5      n[
        R                  " UR                  5      [
        R                  :w  a   U R                  [        R                  5        gg)Nrm  FT)rX   r;   endswithr7   r@   r8   r2  r0   rX  r  r  r  )rS   r=   r*   s      r'   flag_onlydir_error FsInfoChannel.flag_onlydir_error+  s`     zz!3!3C!8!8hhrl;;s{{#t||3emm,r)   c                    U R                  U5      (       a  g Xl        S1nU R                  (       aD   UR                  [        R
                  " SU R                   35      5        U R                  U l        U R                  U Vs1 s H  o0R                  U5      (       d  M  UiM     snSS9  g ! [         a
    SU l         NLf = fs  snf )Nr  z/proc/self/fd/Tr`  )
r  r=   r  rh  r7   listdirr  r:   rs  rq  )rS   r=   rl  rr  s       r'   report_initial_state"FsInfoChannel.report_initial_state9  s    ""2&&$<<,rzzN477)*DEF)-&
 	G13C3CA3FQGtT	  ,)+&, Hs   AB/ C"C/CCr   cookierawnamer   c                 N   [         R                  SXU5        U=(       d    SR                  SS9nU R                  U5        U(       a^  U[        R
                  [        R                  -  [        R                  -  [        R                  -  -  (       a  U R                  S5        g g g )Nzdo_inotify_event(%r, %r, %r)r)   surrogateescaper}   r  )	r   r   r   r  r   r   r   r   r   )rS   r   r  r  rR   s        r'   r   FsInfoChannel.do_inotify_eventJ  s    3T7K3&&.?&@T"DL//,2E2EE(1124@4K4KL M   $M4r)   c                     [         R                  SX5        U R                  b  U R                  R                  5         Uc  Uc   eU R	                  U5        g U R                  U5        g )Nzdo_identity_changed(%r, %r))r   r   r  clearr  r  r   s      r'   r  !FsInfoChannel.do_identity_changedU  sV    2B<<<#LL ;>!>%%b)c"r)   c                 v    U R                   c   eU R                   R                  5         U R                  5         g r?   )r  re   r  s    r'   r	  FsInfoChannel.do_closeb  s+    ***

r)   rf   c                    [        US5      U l        [        R                  R                  U R                  5      (       d  [	        US5      e[        [        US5      5      nU R                  USS1-
  5      U l        [        USSU;   a  SOS5      U l	        SU;   U l
        [        US	S
S9U l        [        USSS9U l        U R                  (       a  U R                  (       d  [	        US5      eU R                  (       a  U R                  (       d  [	        US5      e0 U l        U R                  5         U R                  (       d   [         R"                  " U R                  U R                  (       a  [        R$                  O [        R$                  [        R&                  -  5      nU R)                  U5        UR+                  5         U R3                  5         U R+                  5         g [5        U R                  U 5      U l        g ! [,         a8  nUR.                  (       d   eU R1                  UR.                  5         S nANzS nAff = f)Nr;   z"path" must be an absolute pathr   r  rl  r  *r  r  T)defaultrX   Fz>"watch: true" and "follow: false" are (currently) incompatiblezB`targets: "stat"` and `follow: false` are (currently) incompatible)r   r;   r7   isabsr   re  r   r^  r  r  r  r   r  rX   r  rc   r   r   O_PATH
O_NOFOLLOWr  re   r:   r  r  rd   r   r  )rS   rf   r   r=   r   s        r'   ri   FsInfoChannel.do_openh  s   GV,	ww}}TYY''G%FGGHWg./**5Iy3I+IJw	)u:L3RTU E)w$?gw>
::dkkG%eff<<G%ijj

zz[[BII"))VXVcVcJcd
 ))"-
IIKJJL (		48DO  -yy y!!#)),,-s   A!H 
I.II)r  r  r=   r  r  r  r;   r  r  r  rX   r  )r=   r  r  r   r   N)!rl   rm   rn   ro   rp   ra   r   boolr   r  r=   r  r  r  r   r^  ri  rs  rv  rq  r  r$   r  r   r  r  r   r   r  r	  r   ri   rq   rk   r)   r'   r  r    sq   G ILMLK sB!%G%%)J")::/Xc] //b / /b ?D $8 $t $ $ DI 6j 6D 6T 66A A AC D   V  Uv U$ U"	%\ 	%3 	% 	%\` 	%#$9z $9d $9r)   r  )r;   zint | str | Pathr   r5   )@r|  r   enumr  r  rU  r   loggingr7   r   r    r8   r   pathlibr   typingr   r   r   cockpit._vendor.systemd_ctypesr   r   &cockpit._vendor.systemd_ctypes.inotifyr	   r   (cockpit._vendor.systemd_ctypes.pathwatchr
   PathWatchListenerchannelr   r   r   r   jsonutilr   r   r   r   r   r   r   r   r   r   r   	getLoggerrl   r   rV  r$   r(   stat_resultra   r4   r<   rA   rC   rs   r   r   r   Enumr  r  rk   r)   r'   <module>r     s,  $       
  	 
 	    0 0 < H R K K    
		8	$ 7# 7 7
Vr~~ V# VC L %G %P%L$ %LP% %PDL| DLN<W/ <~TYY 
u9G. u9r)   