o
    ¨¼hx  ã                   @   s`   d dl Z d dlZd dlZd dlZd dlmZmZmZ d dlm	Z	m
Z
 e e¡ZG dd„ dƒZdS )é    N)ÚDictÚTypeÚAny)ÚDriverPluginÚCountermeasurePluginc                   @   s€   e Zd ZdZdefdd„Zdd„ Zdedefd	d
„Zdede	fdd„Z
dede	fdd„Zdedefdd„Zdedefdd„ZdS )ÚPluginManageruU   
    æ’ä»¶ç®¡ç†å™¨ï¼Œè´Ÿè´£åŠ è½½å’Œç®¡ç†é©±åŠ¨æ’ä»¶ä¸Žååˆ¶åŠ¨ä½œæ’ä»¶ã€‚
    Úplugin_dirsc                 C   s   || _ i | _i | _d S )N)r   ÚdriversÚcountermeasures)Úselfr   © r   ú /root/ive/core/plugin_manager.pyÚ__init__   s   
zPluginManager.__init__c                 C   sú   | j D ]w}tj |¡st d|› d¡ qtj |d¡}tj |¡r)|  ||¡ qz4t 	|¡D ],}tj ||¡}tj |¡r[tj |d¡}tj |¡rR|  ||¡ q/t 
d|› d¡ q/W q tyz } zt d|› d|› ¡ W Y d}~qd}~ww dS )	u   æ‰«æå¹¶åŠ è½½æ‰€æœ‰æ’ä»¶zPlugin directory z does not exist.zplugin.jsonzPlugin config z not found.zError scanning directory ú: N)r   ÚosÚpathÚisdirÚloggerÚwarningÚjoinÚexistsÚ_load_plugin_from_configÚlistdirÚdebugÚOSErrorÚerror)r   Ú
plugin_dirÚplugin_config_pathÚitemZ	item_pathZsub_plugin_config_pathÚer   r   r   Úload_plugins   s.   
€ù"€ÿëzPluginManager.load_pluginsr   r   c              
   C   s
  zt |ddd}t |¡}W d  ƒ n1 sw   Y  W n< tjy= } zt d|› d|› ¡ W Y d}~dS d}~w tyZ } zt d|› d|› ¡ W Y d}~dS d}~ww | d¡}|d	krl|  ||¡ dS |d
krx|  	||¡ dS t 
d|› d|› ¡ dS )u!   ä»Žé…ç½®æ–‡ä»¶åŠ è½½å•ä¸ªæ’ä»¶Úrzutf-8)ÚencodingNzError decoding JSON from r   zError reading ÚtypeÚdriverZcountermeasurezUnknown plugin type 'z' in )ÚopenÚjsonÚloadÚJSONDecodeErrorr   r   Ú	ExceptionÚgetÚ_load_driver_pluginÚ_load_countermeasure_pluginr   )r   r   r   ÚfÚconfigr   Zplugin_typer   r   r   r   .   s(   ÿ€€€þ
z&PluginManager._load_plugin_from_configr.   c              
   C   ób  |  d¡}|  d¡}|r|st d|› ¡ dS z[| dd¡\}}tj |tj 	||› d¡¡}|du rBt d|› d	|› ¡ W dS tj 
|¡}|j |¡ t||ƒ}	t|	tƒrh|	| j|< t d
|› ¡ W dS t d|› d¡ W dS  ttfy“ }
 zt d|› d|
› ¡ W Y d}
~
dS d}
~
w ty° }
 zt d|› d|
› ¡ W Y d}
~
dS d}
~
ww )u   åŠ è½½é©±åŠ¨æ’ä»¶ÚnameÚentry_pointz Invalid driver plugin config in NÚ.é   ú.pyz(Failed to create spec for driver plugin ú from zLoaded driver plugin: úPlugin z+ does not implement DriverPlugin interface.zFailed to load driver plugin r   z'Unexpected error loading driver plugin )r*   r   r   ÚrsplitÚ	importlibÚutilÚspec_from_file_locationr   r   r   Úmodule_from_specÚloaderÚexec_moduleÚgetattrÚ
issubclassr   r	   ÚinfoÚImportErrorÚAttributeErrorr)   )r   r   r.   r0   r1   Úmodule_nameÚ
class_nameÚspecÚmoduleÚdriver_classr   r   r   r   r+   B   ó2   




$€$€ÿz!PluginManager._load_driver_pluginc              
   C   r/   )u   åŠ è½½ååˆ¶åŠ¨ä½œæ’ä»¶r0   r1   z(Invalid countermeasure plugin config in Nr2   r3   r4   z0Failed to create spec for countermeasure plugin r5   zLoaded countermeasure plugin: r6   z3 does not implement CountermeasurePlugin interface.z%Failed to load countermeasure plugin r   z/Unexpected error loading countermeasure plugin )r*   r   r   r7   r8   r9   r:   r   r   r   r;   r<   r=   r>   r?   r   r
   r@   rA   rB   r)   )r   r   r.   r0   r1   rC   rD   rE   rF   Úcm_classr   r   r   r   r,   _   rH   z)PluginManager._load_countermeasure_pluginr0   Úreturnc                 C   ó   | j  |¡}|r|ƒ S dS )u   èŽ·å–é©±åŠ¨å®žä¾‹N)r	   r*   )r   r0   rG   r   r   r   Ú
get_driver|   ó   zPluginManager.get_driverc                 C   rK   )u   èŽ·å–ååˆ¶åŠ¨ä½œå®žä¾‹N)r
   r*   )r   r0   rI   r   r   r   Úget_countermeasureƒ   rM   z PluginManager.get_countermeasureN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úlistr   r    Ústrr   Údictr+   r,   r   rL   r   rN   r   r   r   r   r      s    r   )r   r&   r8   ÚloggingÚtypingr   r   r   Úpluginsr   r   Ú	getLoggerrO   r   r   r   r   r   r   Ú<module>   s    
