<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
3
<e                 @   s   d dl Z d dlZd dlZd dlZddlmZ d dlZd dlj	Z	d dl
mZ d dlZd dlZd dlZejj ZG dd dejZdS )    N   )
interfaces)ismethodc               @   s   e Zd ZdZejejejejej	fddZ
dd Zdd Zdd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zd$ddZd%ddZdd Zdd Zd d! Zd"d# ZdS )&UnixSocketExportera9  
	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             C   s  || _ d | _|rtjd|ng | _g | _dd	g| _|r|j }xt|d d D ]\}}yt|| j|< W qP t	k
r   y2|dkrt
j|j| j|< ntj|j| j|< W n2 tk
r   tjd|dkrdnd|f  Y nX Y qPX qPW || _|| _i | _t | _d | _d | _d S )
Nz,;r      r   z(%s '%s' does not exists, leaving defaultZUserZGroupr   )_socket_path_socket_objectresplit_socket_signal_pathsZ_socket_signal_objects
_ownership	enumerateint
ValueErrorpwdgetpwnamZpw_uidgrpZgetgrnamZgr_gidKeyErrorlogerror_permissions_connections_backlog_unix_socket_methodsset_signalsZ_connZ_channel)selfZsocket_pathZsignal_pathsZ	ownershipZpermissionsZconnections_backlogio r   */usr/lib/python3.6/unix_socket_exporter.py__init__   s.    
.zUnixSocketExporter.__init__c             C   s
   | j d k	S )N)r	   )r   r   r   r    running;   s    zUnixSocketExporter.runningc                sT   t  std j}|| jkr,td| G  fdddt}|||| j|< d S )Nz#Only bound methods can be exported.z/Method with this name (%s) is already exported.c                   s    e Zd Zdd Z fddZdS )z*UnixSocketExporter.export.<locals>.wrapperc             S   s   || _ || _d S )N)Z_in_signature_out_signature)r   in_signatureout_signaturer   r   r    r!   G   s    z3UnixSocketExporter.export.<locals>.wrapper.__init__c                s
    ||S )Nr   )r   argskwargs)methodr   r    __call__K   s    z3UnixSocketExporter.export.<locals>.wrapper.__call__N)__name__
__module____qualname__r!   r)   r   )r(   r   r    wrapperF   s   r-   )r   	Exceptionr*   r   object)r   r(   r$   r%   method_namer-   r   )r(   r    export>   s    
zUnixSocketExporter.exportc                s^   t  std j}|| jkr,td| G  fdddt}||| j|< | jj| d S )Nz#Only bound methods can be exported.z/Method with this name (%s) is already exported.c                   s    e Zd Zdd Z fddZdS )z*UnixSocketExporter.signal.<locals>.wrapperc             S   s
   || _ d S )N)r#   )r   r%   r   r   r    r!   Y   s    z3UnixSocketExporter.signal.<locals>.wrapper.__init__c                s
    ||S )Nr   )r   r&   r'   )r(   r   r    r)   \   s    z3UnixSocketExporter.signal.<locals>.wrapper.__call__N)r*   r+   r,   r!   r)   r   )r(   r   r    r-   X   s   r-   )r   r.   r*   r   r/   r   add)r   r(   r%   r0   r-   r   )r(   r    signalP   s    
zUnixSocketExporter.signalc             O   s   || j krtd| x| jD ]}tjd|  yDtjtjtj}|jd |j	| | j
|d||d |j  W q tk
r } ztjd|||f  W Y d d }~X qX qW d S )NzSignal '%s' doesn't exist.zSending signal on socket %sFz2.0)jsonrpcr(   paramsz2Error while sending signal '%s' to socket '%s': %s)r   r.   r   r   debugsocketAF_UNIXSOCK_STREAMZsetblockingZconnect
_send_datacloseOSErrorwarning)r   r3   r&   r'   pser   r   r    send_signalb   s    


zUnixSocketExporter.send_signalc             C   s   | j j| d S )N)r   append)r   pathr   r   r    register_signal_pathp   s    z'UnixSocketExporter.register_signal_pathc             C   s   | j rtjj| j r tj| j  tjtjtj| _| jj	| j  | jj
| j tj| j | jd | jd  | jrtj| j | j d S )Nr   r   )r   osrC   existsunlinkr7   r8   r9   r	   ZbindZlistenr   chownr   r   chmod)r   r   r   r    _construct_socket_objects   s    z+UnixSocketExporter._construct_socket_objectc             C   s    | j  rd S | j  | j  d S )N)r"   stoprJ   )r   r   r   r    start~   s    zUnixSocketExporter.startc             C   s   | j r| j j  d S )N)r	   r;   )r   r   r   r    rK      s    zUnixSocketExporter.stopc             C   sb   t jd|  y|jtj|jd W n4 tk
r\ } zt jd||f  W Y d d }~X nX d S )NzSending socket data: %s)zutf-8zFailed to send data '%s': %s)r   r6   sendjsondumpsencoder.   r=   )r   r?   datar@   r   r   r    r:      s
    zUnixSocketExporter._send_dataFc             C   s$   d|d}|r||d< n||d< |S )Nz2.0)r4   idr   resultr   )r   rQ   rR   r   resr   r   r    _create_response   s    
z#UnixSocketExporter._create_responseNc             C   s   | j |||dd|dS )N)codemessagerQ   T)r   rR   )rU   )r   rV   rW   rR   rQ   r   r   r    _create_error_responce   s
    z)UnixSocketExporter._create_error_responcec             C   s   | j ||S )N)rU   )r   rS   rR   r   r   r    _create_result_response   s    z*UnixSocketExporter._create_result_responsec             C   s   |j dr|S d S )NrR   )get)r   rQ   r   r   r    	_check_id   s    
zUnixSocketExporter._check_idc             C   sn  t |tks&|jddks&|jd r2| jddS |jd}d }|d | jkrb| j| jdd|S y|jd	s| j|d   }njt |d	 ttfkr| j|d  |d	  }n>t |d	 tkr| j|d  f |d	 }n| j| jdd|S W nn tk
r$ } z| j| jdd|t	|S d }~X n8 t
k
rZ } z| j| jdd|t	|S d }~X nX | j| j||S )Nr4   z2.0r(   iX  zInvalid RequestrR   iY  zMethod not foundr5   iZ  zInvalid paramsr   Erroriiii)typedictrZ   rX   r   r[   listtuple	TypeErrorstrr.   rY   )r   reqrR   retr@   r   r   r    _process_request   s&    &

$&z#UnixSocketExporter._process_requestc       	   #   C   s  | j  sdS xtj| jgf f d\}}}|r| jj \}}y*d}x |jdj }|sZP ||7 }qFW W n2 tk
r } ztjd|  wW Y dd}~X nX |ryt	j
|}W nR tk
r } z4tjd||f  | j|| jddt| wW Y dd}~X nX t|tttfkr>tjd	 | j|| jddt| qt|ttfkrt|dkrz| j|| jddt| qg }x(|D ] }| j|}|r|j| qW |r| j|| n| j|}|r| j|| qdS qW dS )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
		Nr    i   z"Failed to load data of message: %sz!Failed to load json data '%s': %si  zParse errorzWrong format of calliX  zInvalid RequestiDiDi)r"   selectr	   ZacceptZrecvdecoder.   r   r   rN   loadsr:   rX   rb   r]   r`   r_   r^   lenre   rB   )	r   r_ZconnrQ   Zrec_datar@   rT   rc   r   r   r    period_check   sT    




zUnixSocketExporter.period_check)F)NN)r*   r+   r,   __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"   r1   r3   rA   rD   rJ   rL   rK   r:   rU   rX   rY   r[   re   rm   r   r   r   r    r      s*   

r   )rE   r
   r   r   rf   r   Z
tuned.logsZtunedZtuned.constsro   inspectr   r7   rN   rg   ZlogsrZ   r   ZExporterInterfacer   r   r   r   r    <module>   s   

