<!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
<eO                 @   s   d dl mZ ddlZddlZddlZddlZddlZddlZ	ddl
jZddlZddlZddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ ydd
lmZ dd ZW n  ek
r   ddlmZ Y nX e	jj Zdd ZG dd dej Z!dS )   )
interfaces    N)ismethod)polkit)GLib)FunctionType)DBusException)ErrorMessage)getfullargspecc             C   s   t | S )N)r
   )func r   #/usr/lib/python3.6/dbus_exporter.py
getargspec   s    r   )r   c             C   s   t |dd }|d k	rn0t |dddkr4d|jj }nd|j|jjf }t|trZ|j }ndjtj	|j|}t
|||}|j s| j| d S )NZ_dbus_error_name
__module__ __main__zorg.freedesktop.DBus.Python.%sz!org.freedesktop.DBus.Python.%s.%s)r   r   )getattr	__class____name__r   
isinstancer   Zget_dbus_messagejoin	tracebackformat_exception_onlyr	   Zget_no_replyZsend_message)Z
connectionmessageZ	exceptionnamecontentsZreplyr   r   r   _method_reply_error$   s    

r   c               @   s   e Zd ZdZdd Zedd Zedd Ze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S )DBusExportera+  
	Export method calls through DBus 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   t j tjkrttj_tjjj	dd d | _
d | _i | _t | _|| _|| _|| _|| _d | _d | _t | _tjtj}tj | _tjtj| d S )NT)Zset_as_default)logZgetEffectiveLevelloggingDEBUGr   dbusserviceZmainloopZglibZDBusGMainLoop_dbus_object_clsZ_dbus_object_dbus_methodsset_signals	_bus_name_interface_name_object_name
_namespace_thread_bus_objectr   _polkitsignal	getsignalSIGINTr   ZMainLoop
_main_loop)selfbus_nameinterface_nameobject_name	namespaceZsignal_handlerr   r   r   __init__B   s"    
zDBusExporter.__init__c             C   s   | j S )N)r'   )r2   r   r   r   r3   `   s    zDBusExporter.bus_namec             C   s   | j S )N)r(   )r2   r   r   r   r4   d   s    zDBusExporter.interface_namec             C   s   | j S )N)r)   )r2   r   r   r   r5   h   s    zDBusExporter.object_namec             C   s
   | j d k	S )N)r+   )r2   r   r   r   runningl   s    zDBusExporter.runningc             C   sN   dj |jdjt|jjd}t|dt| j d}t	|j
d t |j}|S )Nz2def {name}({args}):
					return wrapper({args})
		z, )r   argsz<decorator-gen-%d>execr   )formatr   r   r   __func__r9   compilelenr$   r   	co_constslocals)r2   methodwrappersourcecoder   r   r   r   _prepare_for_dbuso   s    zDBusExporter._prepare_for_dbusc                sj   t  std j}|jkr(td fdd}j |}tjjj||dd|}|j|< d S )Nz#Only bound methods can be exported.z*Method with this name is already exported.c                s
  j d  j }|d }tjd||f  jj||}|}|dkrXtjd||f  n|dkrttjd||f  n|dkrtjd||f  t|d d d	g }nZ|dkrtjd
||f  t|d d d	g }n(tj	d||f  t|d d d	g } ||S )N.r   z?checking authorization for action '%s' requested by caller '%s'zJaction '%s' requested by caller '%s' was successfully authorized by polkit   zepolkit error, but action '%s' requested by caller '%s' was successfully authorized by fallback methodr   zLaction '%s' requested by caller '%s' wasn't authorized, ignoring the requestr   zppolkit error and action '%s' requested by caller '%s' wasn't authorized by fallback method, ignoring the requestzvpolkit error and unable to use fallback method to authorize action '%s' requested by caller '%s', ignoring the requestrH   rH   rH   rH   )
r*   r   r   debugr-   Zcheck_authorizationwarninfolisterror)ownerr9   kwargsZ	action_idcallerretZ	args_copy)rA   r2   r   r   rB      s$    z$DBusExporter.export.<locals>.wrapperrP   )Zsender_keyword)	r   	Exceptionr   r$   rE   r!   r"   rA   r(   )r2   rA   Zin_signatureout_signaturemethod_namerB   r   )rA   r2   r   export}   s    
zDBusExporter.exportc                sn   t  std j}|| jkr(td fdd}| j |}tjj| j||}|| j|< | j	j
| d S )Nz#Only bound methods can be exported.z*Method with this name is already exported.c                s
    ||S )Nr   )rN   r9   rO   )rA   r   r   rB      s    z$DBusExporter.signal.<locals>.wrapper)r   rR   r   r$   rE   r!   r"   r.   r(   r&   add)r2   rA   rS   rT   rB   r   )rA   r   r.      s    

zDBusExporter.signalc             O   sf   d}|| j ks| jd krd}yt| j|}W n tk
rD   d}Y nX |rXtd| n
||| d S )NFTzSignal '%s' doesn't exist.)r&   r,   r   AttributeErrorrR   )r2   r.   r9   rO   errrA   r   r   r   send_signal   s    
zDBusExporter.send_signalc             C   s<   | j d k	rtddt|  }t|tjjf| j}|| _ d S )Nz%The exporter class was already build.zDBusExporter_%d)r#   rR   idtyper!   r"   ZObjectr$   )r2   Zunique_nameclsr   r   r   _construct_dbus_object_class   s
    
z)DBusExporter._construct_dbus_object_classc             C   sn   | j  rd S | jd kr| j  | j  tj }tjj| j|}| j|| j	|| _
tj| jd| _| jj  d S )N)target)r8   r#   r]   stopr!   Z	SystemBusr"   ZBusNamer'   r)   r,   	threadingZThread_thread_coder+   start)r2   Zbusr3   r   r   r   rb      s    
zDBusExporter.startc             C   s2   | j d k	r.| j j r.| jj  | j j  d | _ d S )N)r+   Zis_aliver1   quitr   )r2   r   r   r   r_      s    

zDBusExporter.stopc             C   s   | j j  | `d | _d S )N)r1   Zrunr,   )r2   r   r   r   ra      s    
zDBusExporter._thread_codeN)r   r   __qualname____doc__r7   propertyr3   r4   r5   r8   rE   rU   r.   rY   r]   rb   r_   ra   r   r   r   r   r   8   s   "	r   )"r   r   Zdbus.servicer!   Zdbus.mainloop.glibZdbus.exceptionsr`   r.   Z
tuned.logsZtunedZtuned.constsZconstsr   r   inspectr   Ztuned.utils.polkitr   Zgi.repositoryr   typesr   r   Zdbus.lowlevelr	   r
   r   ImportErrorZlogsgetr   r   ZExporterInterfacer   r   r   r   r   <module>   s.   

