????

Your IP : 13.58.214.82


Current Path : /lib/python3.6/site-packages/tuned/exports/__pycache__/
Upload File :
Current File : //lib/python3.6/site-packages/tuned/exports/__pycache__/unix_socket_exporter.cpython-36.pyc

3

�<�e��@s�ddlZddlZddlZddlZddlmZddlZddlj	Z	ddl
mZddlZddl
Z
ddlZejj�ZGdd�dej�ZdS)�N�)�
interfaces)�ismethodc@s�eZdZdZejejejejej	fdd�Z
dd�Zdd�Zdd	�Z
d
d�Zdd
�Zdd�Zdd�Zdd�Zdd�Zd$dd�Zd%dd�Zdd�Zdd�Zd d!�Zd"d#�ZdS)&�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.
	cCs||_d|_|rtjd|�ng|_g|_dd	g|_|r�|j�}x�t|dd��D]�\}}yt|�|j|<WqPt	k
r�y2|dkr�t
j|�j|j|<nt
j|�j|j|<Wn2tk
r�tjd|dkr�dnd|f�YnXYqPXqPW||_||_i|_t�|_d|_d|_dS)
Nz,;r�rz(%s '%s' does not exists, leaving defaultZUserZGroup���r)�_socket_path�_socket_object�re�split�_socket_signal_pathsZ_socket_signal_objects�
_ownership�	enumerate�int�
ValueError�pwd�getpwnamZpw_uid�grpZgetgrnamZgr_gid�KeyError�log�error�_permissions�_connections_backlog�_unix_socket_methods�set�_signalsZ_connZ_channel)�selfZsocket_pathZsignal_pathsZ	ownershipZpermissionsZconnections_backlog�i�o�r�*/usr/lib/python3.6/unix_socket_exporter.py�__init__s.
.zUnixSocketExporter.__init__cCs
|jdk	S)N)r	)rrrr �running;szUnixSocketExporter.runningcsTt��std���j}||jkr,td|��G�fdd�dt�}|||�|j|<dS)Nz#Only bound methods can be exported.z/Method with this name (%s) is already exported.cs eZdZdd�Z�fdd�ZdS)z*UnixSocketExporter.export.<locals>.wrappercSs||_||_dS)N)Z
_in_signature�_out_signature)r�in_signature�
out_signaturerrr r!Gsz3UnixSocketExporter.export.<locals>.wrapper.__init__cs
�||�S)Nr)r�args�kwargs)�methodrr �__call__Ksz3UnixSocketExporter.export.<locals>.wrapper.__call__N)�__name__�
__module__�__qualname__r!r)r)r(rr �wrapperFsr-)r�	Exceptionr*r�object)rr(r$r%�method_namer-r)r(r �export>s
zUnixSocketExporter.exportcs^t��std���j}||jkr,td|��G�fdd�dt�}||�|j|<|jj|�dS)Nz#Only bound methods can be exported.z/Method with this name (%s) is already exported.cs eZdZdd�Z�fdd�ZdS)z*UnixSocketExporter.signal.<locals>.wrappercSs
||_dS)N)r#)rr%rrr r!Ysz3UnixSocketExporter.signal.<locals>.wrapper.__init__cs
�||�S)Nr)rr&r')r(rr r)\sz3UnixSocketExporter.signal.<locals>.wrapper.__call__N)r*r+r,r!r)r)r(rr r-Xsr-)rr.r*rr/r�add)rr(r%r0r-r)r(r �signalPs
zUnixSocketExporter.signalcOs�||jkrtd|��x�|jD]�}tjd|�yDtjtjtj�}|jd�|j	|�|j
|d||d��|j�Wqtk
r�}ztj
d|||f�WYdd}~XqXqWdS)NzSignal '%s' doesn't exist.zSending signal on socket %sFz2.0)�jsonrpcr(�paramsz2Error while sending signal '%s' to socket '%s': %s)rr.rr�debug�socket�AF_UNIX�SOCK_STREAMZsetblockingZconnect�
_send_data�close�OSError�warning)rr3r&r'�p�s�errr �send_signalbs


zUnixSocketExporter.send_signalcCs|jj|�dS)N)r�append)r�pathrrr �register_signal_pathpsz'UnixSocketExporter.register_signal_pathcCs�|jr�tjj|j�r tj|j�tjtjtj�|_|jj	|j�|jj
|j�tj|j|j
d|j
d�|jr�tj|j|j�dS)Nrr)r�osrC�exists�unlinkr7r8r9r	ZbindZlistenr�chownr
r�chmod)rrrr �_construct_socket_objectssz+UnixSocketExporter._construct_socket_objectcCs |j�rdS|j�|j�dS)N)r"�stoprJ)rrrr �start~szUnixSocketExporter.startcCs|jr|jj�dS)N)r	r;)rrrr rK�szUnixSocketExporter.stopcCsbtjd|�y|jtj|�jd��Wn4tk
r\}ztjd||f�WYdd}~XnXdS)NzSending socket data: %s)zutf-8zFailed to send data '%s': %s)rr6�send�json�dumps�encoder.r=)rr?�datar@rrr r:�s
zUnixSocketExporter._send_dataFcCs$d|d�}|r||d<n||d<|S)Nz2.0)r4�idr�resultr)rrQrRr�resrrr �_create_response�s
z#UnixSocketExporter._create_responseNcCs|j|||d�d|d�S)N)�code�messagerQT)rrR)rU)rrVrWrRrQrrr �_create_error_responce�s
z)UnixSocketExporter._create_error_responcecCs|j||�S)N)rU)rrSrRrrr �_create_result_response�sz*UnixSocketExporter._create_result_responsecCs|jd�r|SdS)NrR)�get)rrQrrr �	_check_id�s
zUnixSocketExporter._check_idcCsnt|�tks&|jd�dks&|jd�r2|jdd�S|jd�}d}|d|jkrb|j|jdd|��Sy�|jd	�s�|j|d�}njt|d	�ttfkr�|j|d|d	�}n>t|d	�tkr�|j|df|d	�}n|j|jdd|��SWnntk
�r$}z|j|jdd|t	|���Sd}~Xn8t
k
�rZ}z|j|jdd
|t	|���Sd}~XnX|j|j||��S)Nr4z2.0r(iXzInvalid RequestrRiYzMethod not foundr5iZzInvalid paramsr�Errori����i����i����i����)�type�dictrZrXrr[�list�tuple�	TypeError�strr.rY)r�reqrR�retr@rrr �_process_request�s&&

$&z#UnixSocketExporter._process_requestc	#Cs�|j�sdS�x�tj|jgffd�\}}}|�r�|jj�\}}y*d}x |jd�j�}|sZP||7}qFWWn2tk
r�}ztjd|�wWYdd}~XnX|�r�yt	j
|�}WnRtk
�r}z4tjd||f�|j||jddt
|���wWYdd}~XnXt|�tttfk�r>tjd	�|j||jd
dt
|���qt|�ttfk�r�t|�dk�rz|j||jddt
|���qg}x(|D] }|j|�}|�r�|j|��q�W|�r�|j||�n|j|�}|�r�|j||�qdSqWdS)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�iz"Failed to load data of message: %sz!Failed to load json data '%s': %si�zParse errorzWrong format of calliXzInvalid RequestiD���iD���i����)r"�selectr	ZacceptZrecv�decoder.rrrN�loadsr:rXrbr]r`r_r^�lenrerB)	r�r�_ZconnrQZrec_datar@rTrcrrr �period_check�sT




zUnixSocketExporter.period_check)F)NN)r*r+r,�__doc__�constsZCFG_DEF_UNIX_SOCKET_PATHZ CFG_DEF_UNIX_SOCKET_SIGNAL_PATHSZCFG_DEF_UNIX_SOCKET_OWNERSHIPZCFG_DEF_UNIX_SOCKET_PERMISIONSZ'CFG_DEF_UNIX_SOCKET_CONNECTIONS_BACKLOGr!r"r1r3rArDrJrLrKr:rUrXrYr[rermrrrr rs*

r)rEr
rrrfrZ
tuned.logsZtunedZtuned.constsro�inspectrr7rNrgZlogsrZrZExporterInterfacerrrrr �<module>s