Warning: session_start(): Session cannot be started after headers have already been sent in /home/tvrreohg/public_html/manga.php on line 13
3 À<×eÀã@s‚ddlZddlZddlZddlZddlmZddlZddlj Z ddl m Z ddl Z ddl Z ddlZejjƒZGdd„dejƒZdS)éNé)Ú interfaces)Úismethodc@sªeZdZdZejejejejej fdd„Z dd„Z dd„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)ÚselfZ socket_pathZ signal_pathsZ ownershipZ permissionsZconnections_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..wrappercSs||_||_dS)N)Z _in_signatureÚ_out_signature)rÚ in_signatureÚ out_signaturerrr r!Gsz3UnixSocketExporter.export..wrapper.__init__cs ˆ||ŽS)Nr)rÚargsÚkwargs)Úmethodrr Ú__call__Ksz3UnixSocketExporter.export..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..wrappercSs ||_dS)N)r#)rr%rrr r!Ysz3UnixSocketExporter.signal..wrapper.__init__cs ˆ||ŽS)Nr)rr&r')r(rr r)\sz3UnixSocketExporter.signal..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_STREAMZ setblockingZconnectÚ _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 dd t |ƒƒƒ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¼z Parse 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 Ús