+
     Gi  c                   s    ^ RI t ^ RIt^ RIt^ RIt^RIHt ^ RIt^ RIH	t	 ^ RI
Ht ^ RIt^ RIt^ RIt]P                  P!                  4       t ! R R]P$                  4      tR# )    N)
interfaces)ismethodc                   s   a  ] tR t^t o Rt]P                  ]P                  ]P                  ]P                  ]P                  3R ltR tR tR tR tR tR tR	 tR
 tR tRR ltRR ltR tR tR tR tRtV tR# )UnixSocketExportera3  
Export method calls through Unix Domain Socket Interface.

We take a method to be exported and create a simple wrapper function
to call it. This is required as we need the original function to be
bound to the original object instance. While the wrapper will be bound
to an object we dynamically construct.
c           	     s   Wn         R V n        W n        . V n        RR.V n        V'       dE   VP                  4       p\        VR,          4       F  w  rg \        V4      V P                  V&   K   	  W@n        WPn        / V n        \+        4       V n        R V n        R V n        R #   \         d     T^ 8X  d1   \        P                  ! T4      P                  T P                  T&    K  \        P                  ! T4      P                  T P                  T&    K    \         d,    \         P#                  T^ 8X  d   RMR: RT: R24         K  i ; ii ; i)N:Ni   NZUserZGroupz 'z"' does not exists, leaving defaulti)_socket_path_socket_object_socket_signal_paths_socket_signal_objects
_ownershipZsplitZ	enumerateZintZ
ValueErrorpwdZgetpwnamZpw_uidgrpZgetgrnamZgr_gidZKeyErrorlogerror_permissions_connections_backlog_unix_socket_methodsZset_signals_conn_channel)selfZsocket_pathZsignal_pathsZ	ownershipZpermissionsZconnections_backlogZiZos   &&&&&&  G/usr/lib/python3.14/site-packages/tuned/exports/unix_socket_exporter.py__init__ZUnixSocketExporter.__init__   s     "$* "$H$/ 92'tqaa&T__Q ( "1 $%$-$*$-!  	aa	
aLLO22tq  LLO22tq a	iiQfT[>[]^_``a	as0   B""E.4D%-D1EE
EEc                s    V P                   R J# N)r   r      &r   runningZUnixSocketExporter.running;   s    			D	((    c                s   a \        S4      '       g   \        R 4      hSP                  pW@P                  9   d   \        RV,          4      h ! V3R lR\        4      pV! W#4      V P                  V&   R# )#Only bound methods can be exported./Method with this name (%s) is already exported.c                   s4   <a  ] tR t^Ft o R tV3R ltRtV tR# )*UnixSocketExporter.export.<locals>.wrapperc                s    Wn         W n        R # r   Z_in_signature_out_signature)r   in_signatureout_signature   &&&r   r   Z3UnixSocketExporter.export.<locals>.wrapper.__init__G   s    %'r   c                   < S! V/ VB # r    r   argskwargsmethod   &*,r   __call__Z3UnixSocketExporter.export.<locals>.wrapper.__call__K       4"6""r   r   N__name__
__module____qualname____firstlineno__r   r*   __static_attributes____classdictcell____classdict__r(      @r   wrapperr   F   s     (# #r   r6   N)r   	Exceptionr-   r   object)r   r(   r    r!   method_namer6   s   &f&&  r   exportZUnixSocketExporter.export>   sc    	&			8	99+---	D{R	SS# # ,3<+O$K(r   c                s   a \        S4      '       g   \        R 4      hSP                  pW0P                  9   d   \        RV,          4      h ! V3R lR\        4      pV! V4      V P                  V&   V P
                  P                  V4       R# )r   r   c                   s4   <a  ] tR t^Xt o R tV3R ltRtV tR# )*UnixSocketExporter.signal.<locals>.wrapperc                s    Wn         R # r   r   )r   r!      &&r   r   Z3UnixSocketExporter.signal.<locals>.wrapper.__init__Y   s    'r   c                r#   r   r$   r%   r)   r   r*   Z3UnixSocketExporter.signal.<locals>.wrapper.__call__\   r+   r   r<   Nr,   r3   r5   r   r6   r;   X   s     (# #r   r6   N)r   r7   r-   r   r8   r   Zadd)r   r(   r!   r9   r6   s   &f&  r   signalZUnixSocketExporter.signalP   su    	&			8	99+---	D{R	SS# # ,3=+A$K(--K r   c           
     s   WP                   9   g   \        R V,          4      hV P                   F  p\        P	                  RV,          4        \
        P
                  ! \
        P                  \
        P                  4      pVP                  R4       VP                  V4       V P                  VRRRVRV/4       VP                  4        K  	  R
#   \         d-   p\        P                  RT: RT: R	T: 24        R
p?K  R
p?ii ; i)zSignal '%s' doesn't exist.zSending signal on socket %sFjsonrpc2.0r(   paramszError while sending signal 'z' to socket '': N)r   r7   r   r   debugsocketAF_UNIXSOCK_STREAMZsetblockingZconnect
_send_datacloseZOSErrorwarning)r   r>   r&   r'   Zpses   &&*,   r   send_signalZUnixSocketExporter.send_signalb   s    	==	 	/&8	99$$a99*Q./Wfnnf&8&89AMM%IIaLOOA	5(FHdKLGGI %  WKKPQSTUVVWs   A=CD	!DD	c                s<    V P                   P                  V4       R # r   )r   append)r   pathr=   r   register_signal_pathZ'UnixSocketExporter.register_signal_pathp   s    ""4(r   c                s   V P                   '       EdW   \        P                  P                  V P                   4      '       d!   \        P                  ! V P                   4       \
        P
                  ! \
        P                  \
        P                  4      V n        V P                  P                  V P                   4       V P                  P                  V P                  4       \        P                  ! V P                   V P                  ^ ,          V P                  ^,          4       V P                  '       d.   \        P                  ! V P                   V P                  4       R# R# R# )r    N)r   osrN   ZexistsZunlinkrD   rE   rF   r   ZbindZlistenr   Zchownr   r   Zchmodr   r   r   _construct_socket_objectZ+UnixSocketExporter._construct_socket_objects   s    	ggnnT&&''IId v~~v7I7IJ4D--.d77888Dtq14??13EF
HHT 1 12  r   c                sv    V P                  4       '       d   R # V P                  4        V P                  4        R # r   )r   stoprQ   r   r   r   startZUnixSocketExporter.start~   s%    	\\^^	))+!r   c                sb    V P                   '       d   V P                   P                  4        R # R # r   )r   rH   r   r   r   rR   ZUnixSocketExporter.stop   s%    	 r   c                s   \         P                  R V,          4        VP                  \        P                  ! V4      P                  R4      4       R#   \         d)   p\         P                  RT: RT: 24        Rp?R# Rp?ii ; i)zSending socket data: %s)zutf-8zFailed to send data 'rB   N)r   rC   ZsendjsonZdumpsZencoder7   rI   )r   rJ   datarK   s   &&& r   rG   ZUnixSocketExporter._send_data   s]    ))&-.;66$**T

!
!'
*+	 ;;;q9::;s   4A BBBc                s6    R RRV/pV'       d   WR&   V# WR&   V# )r?   r@   idr   resultr$   )r   rU   rV   r   ress   &&&& r   _create_responseZ#UnixSocketExporter._create_response   s4    e	# w< 
* x=	*r   Nc                s6    V P                  R VRVRV/RVR7      # )codemessagerU   T)r   rV   rY   )r   rZ   r[   rV   rU   s   &&&&&r   _create_error_responceZ)UnixSocketExporter._create_error_responce   s5    				4g	4  B	 
 
 r   c                s$    V P                  W4      # r   r\   )r   rW   rV   r"   r   _create_result_responseZ*UnixSocketExporter._create_result_response   s    			v	**r   c                s8    VP                  R 4      '       d   V# R# )rV   N)get)r   rU   r=   r   	_check_idZUnixSocketExporter._check_id   s    	XXd^^
;	r   c                sP   \        V4      \        8w  g.   VP                  R 4      R8w  g   VP                  R4      '       g   V P                  R
R4      # VP                  R4      pRpVR,          V P                  9  d#   V P                  V P                  RRV4      4      #  VP                  R4      '       g!   V P                  VR,          ,          ! 4       pM\        VR,          4      \        \        39   d'   V P                  VR,          ,          ! VR,          !  pMe\        VR,          4      \        8X  d)   V P                  VR,          ,          ! R/ VR,          B pM"V P                  V P                  R
RV4      4      # V P                  V P                  W24      4      #   \         d7   pT P                  T P                  RRT\        T4      4      4      u Rp?# Rp?i\         d7   pT P                  T P                  ^R	T\        T4      4      4      u Rp?# Rp?ii ; i)r?   r@   r(   Invalid RequestrV   NzMethod not foundrA   zInvalid paramsZError騀ir$   i)typedictr_   r]   r   r`   listtupleZ	TypeErrorstrr7   r^   )r   reqrV   ZretrK   s   &&   r   _process_requestZ#UnixSocketExporter._process_request   s   	#Y$#''),5SWWX=N=N

%
%f.?
@@
wwt}"#]$333
..44V=OQST
UUN
''(



#
#CM
2
4CS]e},

#
#CM
2CM
BCS]t#

#
#CM
2
CS]
CC>>$55f>OQSTUU
 
44S=	>>	 
 \
..44V=MrSVWXSYZ
[[	 N
..44QSVL
MMNsP   "F% 9F% AF%  AF% #!F% %H%0+G!H%!H%.H%/+H H% H%c                s4   V P                  4       '       g   R#  \        P                  ! V P                  .R
R
^ 4      w  p pV'       Ed   V P                  P                  4       w  r2 Rp VP	                  R4      P                  4       pV'       g   M
WE,          pK3  V'       EdX    \        P                  ! V4      p\        T4      \        \         \"        39  dD   \        P                  R4       T P                  Y0P                  RR\        X4      4      4       EK  \        T4      \        \         39   d   \%        T4      ^ 8X  d/   T P                  Y0P                  RR	\        X4      4      4       EK^  . pT F/  pT P'                  T4      pT'       g   K  TP)                  T4       K1  	  T'       d   T P                  Y74       EK  EK  T P'                  T4      pT'       d   T P                  Y74       EK  EK  EK  R#   \         d)   p\        P                  RT,          4        Rp?EK  Rp?ii ; i  \         dU   p\        P                  RT: RT: 24       T P                  Y0P                  RR\        T4      4      4        Rp?EKy  Rp?ii ; i)a  
Periodically checks socket object for new calls. This allows to function without special thread.
Interface is according JSON-RPC 2.0 Specification (see https://www.jsonrpc.org/specification)

Example calls:

printf '[{"jsonrpc": "2.0", "method": "active_profile", "id": 1}, {"jsonrpc": "2.0", "method": "profiles", "id": 2}]' | nc -U /run/tuned/tuned.sock
printf '{"jsonrpc": "2.0", "method": "switch_profile", "params": {"profile_name": "balanced"}, "id": 1}' | nc -U /run/tuned/tuned.sock
N i   z"Failed to load data of message: %szFailed to load json data 'rB   zParse errorzWrong format of callra   r$   iDrb   )r   selectr   ZacceptZrecvZdecoder7   r   r   rT   ZloadsrG   r]   rg   rc   rf   re   rd   Zlenri   rM   )	r   ZrZ_ZconnrU   Zrec_datarK   rX   rh   s	   &        r   period_checkZUnixSocketExporter.period_check   s    
	]]D//0"b!<71aa!!((*GD	T4'')h
d tZZd
 	T
5$--	ii&'
ood77sSTvVWT
udm#	Tat88ARTWXYTZ[\c#  %q
!

1  
t! 
 !!$'c	
t! 
1 6 =  YY3a78  	iitQ?@
ood77sSTvVWs7   ()H 
H 'H8 H5H00H58JAJJ)r   r   r   r   r   r   r   r   r   r   r   )F)NN)r-   r.   r/   r0   Z__doc__constsZCFG_DEF_UNIX_SOCKET_PATHZ CFG_DEF_UNIX_SOCKET_SIGNAL_PATHSZCFG_DEF_UNIX_SOCKET_OWNERSHIPZCFG_DEF_UNIX_SOCKET_PERMISIONSZ'CFG_DEF_UNIX_SOCKET_CONNECTIONS_BACKLOGr   r   r:   r>   rL   rO   rQ   rS   rR   rG   rY   r]   r^   r`   ri   rl   r1   r2   )r4   s   @r   r   r      s      !' ? ?993366GG	 D)P$!$W)	3";	+
?,5 5r   r   )rP   Zrer	   r
   rj   r   Z
tuned.logsZtunedZtuned.constsrm   Zinspectr   rD   rT   rk   Zlogsr_   r   ZExporterInterfacer   r$   r   r   <module>rn      sG    	 	        jjnnf55 fr   