o
    _3                     @   sP   d dl Z d dlZd dlmZ dgZej ZG dd deZ	G dd deZ
dS )    N)consts	Inventoryc                   @   s\   e Zd ZdZd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S )r   z
	Inventory object can handle information about available hardware devices. It also informs the plugins
	about related hardware events.
	NTc                 C   s   |d ur|| _ nt | _ |d u rtj}|| j | _|d u r"tj}|r;z| j| W n t	y:   t
d Y nw |d u rBt }|| _d | _i | _d S )Nzcannot set udev monitor receive buffer size, we are probably running inside container or with limited capabilites, Tuned functionality may be limited)_udev_contextpyudevContextMonitorfrom_netlink_udev_monitorr   CFG_DEF_UDEV_BUFFER_SIZEset_receive_buffer_sizeEnvironmentErrorlogwarn_MonitorObserverFactory_monitor_observer_factory_monitor_observer_subscriptions)selfudev_contextudev_monitor_clsmonitor_observer_factorybuffer_sizer    r   :/usr/lib/python3/dist-packages/tuned/hardware/inventory.py__init__   s&   

zInventory.__init__c                 C   s:   z
t j| j||W S  ty   t j| j|| Y S w )z9Get a pyudev.Device object for the sys_name (e.g. 'sda').)r   Devices	from_namer   AttributeErrorDevice)r   	subsystemsys_namer   r   r   
get_device)   s
   zInventory.get_devicec                 C   s   | j j|dS )z)Get list of devices on a given subsystem.)r   )r   list_devices)r   r   r   r   r   get_devices1   s   zInventory.get_devicesc                 C   st   |j | jvrd S | j|j  D ])\}}z||| W q ty7 } ztd|  t| W Y d }~qd }~ww d S )Nz+Exception occured in event handler of '%s'.)r   r   	Exceptionr   error	exception)r   eventdeviceplugincallbacker   r   r   _handle_udev_event5   s   zInventory._handle_udev_eventc                 C   s^   t d||f  ||f}|| jv r| j| | dS |g| j|< | j| | j  dS )z7Register handler of device events on a given subsystem.zadding handler: %s (%s)N)r   debugr   appendr	   	filter_bystart)r   r)   r   r*   callback_datar   r   r   	subscribe@   s   
zInventory.subscribec                 C   s:   | j d u rtd | j| j| j| _ | j   d S d S )Nzstarting monitor observer)r   r   r-   r   creater	   r,   r0   r   r   r   r   start_processing_eventsL   s
   

z!Inventory.start_processing_eventsc                 C   s,   | j d urtd | j   d | _ d S d S )Nzstopping monitor observer)r   r   r-   stopr4   r   r   r   stop_processing_eventsR   s
   



z Inventory.stop_processing_eventsc                 C   sF   | j | D ]}|\}}||kr td||f  | j | | qd S )Nzremoving handler: %s (%s))r   r   r-   remove)r   r)   r   r1   _pluginr*   r   r   r   _unsubscribe_subsystemX   s   z Inventory._unsubscribe_subsystemc                 C   s^   g }| j D ]}|du s||kr#| || t| j | dkr#|| q|D ]}| j |= q&dS )z4Unregister handler registered with subscribe method.Nr   )r   r:   lenr.   )r   r)   r   empty_subsystems
_subsystemr   r   r   unsubscribe_   s   


zInventory.unsubscribe)NNNNTN)__name__
__module____qualname____doc__r   r!   r#   r,   r2   r5   r7   r:   r>   r   r   r   r   r   	   s    
c                   @   s   e Zd Zdd ZdS )r   c                 O   s   t j|i |S r?   )r   MonitorObserver)r   argskwargsr   r   r   r3   l   s   z_MonitorObserverFactory.createN)r@   rA   rB   r3   r   r   r   r   r   k   s    r   )r   
tuned.logstunedr   __all__logsgetr   objectr   r   r   r   r   r   <module>   s    
b