o
    hh,                     @   sp   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mZ d dl	m
Z
 ejejdd eeZG dd dZdS )    N)ListDictAnyOptional)get_db_managerz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)levelformatc                   @   s  e Zd ZdZd2dedefddZdd	 Zd
d Zdee	ee
f  fddZdedee	ee
f  fddZde	ee
f defddZdede	ee
f 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d e	ee
f defd!d"Zdedee	ee
f  fd#d$Zded%edefd&d'Zdee	ee
f  fd(d)Zdedefd*d+Zded,ee	ee
f  defd-d.Zdedee	ee
f  fd/d0Zd1S )3RuleManageruF   
    规则管理器，负责规则的增删改查和持久化。
    data/honeypot.dbconfig/rules.jsondb_path
rules_filec                 C   s>   || _ g | _t | _|dkrddlm} ||| _|   d S )Nr
   r   )DatabaseManager)r   rulesr   
db_managercore.databaser   _load_rules)selfr   r   r    r   /root/ive/core/rule_manager.py__init__   s   
zRuleManager.__init__c              
   C   s   t j| jrgz=t| jddd}t|}t|tr!|	dg ng | _
W d   n1 s.w   Y  tdt| j
 d| j  W dS  tyf } ztd| j d	|  g | _
W Y d}~dS d}~ww td
| j d g | _
dS )u   从文件加载全局规则rutf-8encodingr   NzLoaded z global rules from zFailed to load rules from : zRules file z/ not found. Initializing with empty rules list.)ospathexistsr   openjsonload
isinstancedictgetr   loggerinfolen	Exceptionerrorwarning)r   fdataer   r   r   r      s   
$
zRuleManager._load_rulesc              
   C   s   zDt jt j| jdd t| jddd%}tjd| ji|ddd	 t	
d
t| j d| j  W d   W dS 1 s=w   Y  W dS  tyc } zt	d| j d|  W Y d}~dS d}~ww )u   将全局规则保存到文件T)exist_okwr   r   r   F   )ensure_asciiindentzSaved z global rules to NzFailed to save rules to r   )r   makedirsr   dirnamer   r   r    dumpr   r%   r&   r'   r(   r)   )r   r+   r-   r   r   r   _save_rules,   s    &&zRuleManager._save_rulesreturnc                 C   s
   | j  S )u   获取所有全局规则)r   copy)r   r   r   r   get_all_rules7   s   
zRuleManager.get_all_rulesrule_idc                 C   s&   | j D ]}|d|kr|  S qdS )u   根据ID获取全局规则idN)r   r$   r   r:   ruler   r   r   get_rule_by_id;   s
   
zRuleManager.get_rule_by_idr=   c                 C   sX   | dstd dS | |d r td|d  d dS | j| |   dS )u   添加新全局规则r;   zRule must have an 'id'FRule with ID 'z' already existsT)r$   r%   r)   r>   r   appendr6   )r   r=   r   r   r   add_ruleB   s   

zRuleManager.add_ruleupdated_rulec                 C   sP   t | jD ]\}}|d|kr|| j|< |    dS qtd| d dS )u   更新全局规则r;   Tr?   z' not found for updateF	enumerater   r$   r6   r%   r*   )r   r:   rB   ir=   r   r   r   update_ruleO   s   
zRuleManager.update_rulec                 C   sN   t | jD ]\}}|d|kr| j|= |    dS qtd| d dS )u   删除全局规则r;   Tr?   z' not found for deletionFrC   )r   r:   rE   r=   r   r   r   delete_ruleY   s   zRuleManager.delete_rulec                 C   s&   |  |}|rd|d< |   dS dS )u   启用全局规则TenabledFr>   r6   r<   r   r   r   enable_rulec      
zRuleManager.enable_rulec                 C   s&   |  |}|rd|d< |   dS dS )u   禁用全局规则FrH   TrI   r<   r   r   r   disable_rulel   rK   zRuleManager.disable_ruleenv_iddriverconfigc              
   C   s   z;| j  +}| }|d||tj|dddf |  td| d 	 W d   W dS 1 s4w   Y  W dS  t	j
yO   td| d	 Y dS  t	jym } ztd
| d|  W Y d}~dS d}~ww )u   
        在数据库中创建一个新环境。
        :param env_id: 环境唯一标识符。
        :param driver: 使用的驱动名称。
        :param config: 环境配置字典。
        :return: 操作是否成功。
        zIINSERT INTO environments (id, driver, config, status) VALUES (?, ?, ?, ?)Fr1   stoppedEnvironment z created in database.NT already exists in database.zError creating environment r   )r   get_connectioncursorexecuter    dumpscommitr%   r&   sqlite3IntegrityErrorr*   Errorr)   )r   rM   rN   rO   connrU   r-   r   r   r   create_environmentw   s&   (	zRuleManager.create_environmentc              
   C   s   zB| j  2}| }|d|f | }|r/t|}t|d |d< |W  d   W S W d   W dS 1 s;w   Y  W dS  tj	ya } zt
d| d|  W Y d}~dS d}~ww )u   
        从数据库获取环境信息。
        :param env_id: 环境唯一标识符。
        :return: 环境信息字典，如果未找到则返回 None。
        z'SELECT * FROM environments WHERE id = ?rO   NzError getting environment r   )r   rT   rU   rV   Zfetchoner#   r    loadsrY   r[   r%   r)   )r   rM   r\   rU   rowenv_datar-   r   r   r   get_environment   s(    zRuleManager.get_environmentstatusc              
   C   s   z4| j  $}| }|d||f |  td| d 	 W d    W dS 1 s-w   Y  W d S  tjyH   t	d| d Y dS  tj
yf } ztd| d|  W Y d }~dS d }~ww )	Nz/UPDATE environments set status = ? where id = ?rR   z update in database.TrS   FzError updateing environment r   )r   rT   rU   rV   rX   r%   r&   rY   rZ   r*   r[   r)   )r   rM   rb   r\   rU   r-   r   r   r   update_environment   s&   (	zRuleManager.update_environmentc              
   C   s   zA| j  1}| }|d | }g }|D ]}t|}t|d |d< || q|W  d   W S 1 s:w   Y  W dS  t	j
y^ } ztd|  g W  Y d}~S d}~ww )u`   
        从数据库列出所有环境。
        :return: 环境信息字典列表。
        zSELECT * FROM environmentsrO   NzError listing environments: )r   rT   rU   rV   fetchallr#   r    r^   r@   rY   r[   r%   r)   )r   r\   rU   rowsenvironmentsr_   r`   r-   r   r   r   list_environments   s"   
(zRuleManager.list_environmentsc              
   C   s   zK| j  ;}| }|d|f |  |jdkr.td| d 	 W d   W dS td| d 	 W d   W dS 1 sDw   Y  W dS  t	j
yj } ztd	| d
|  W Y d}~dS d}~ww )u   
        从数据库删除环境。由于设置了 CASCADE，environment_rules 表中的相关记录也会被自动删除。
        :param env_id: 环境唯一标识符。
        :return: 操作是否成功。
        z%DELETE FROM environments WHERE id = ?r   rR   z deleted from database.NTz not found for deletion.FzError deleting environment r   )r   rT   rU   rV   rX   Zrowcountr%   r&   r*   rY   r[   r)   )r   rM   r\   rU   r-   r   r   r   delete_environment   s"   
(
zRuleManager.delete_environmentr   c           	   
   C   s   zQ| j  A}| }|d|f t|D ]\}}tj|dd}|d|||f q|  t	dt
| d| d 	 W d   W d	S 1 sJw   Y  W dS  tjyp } ztd
| d|  W Y d}~dS d}~ww )u   
        为指定环境设置（覆盖）规则列表。
        :param env_id: 环境唯一标识符。
        :param rules: 要关联到环境的规则对象列表。
        :return: 操作是否成功。
        z6DELETE FROM environment_rules WHERE environment_id = ?FrP   zVINSERT INTO environment_rules (environment_id, rule_data, rule_order) VALUES (?, ?, ?)zSet z rules for environment .NTz$Error setting rules for environment r   )r   rT   rU   rV   rD   r    rW   rX   r%   r&   r'   rY   r[   r)   )	r   rM   r   r\   rU   indexr=   Z	rule_jsonr-   r   r   r   set_environment_rules   s&   (z!RuleManager.set_environment_rulesc           	   
   C   s   z=| j  -}| }|d|f | }g }|D ]}t|d }|| q|W  d   W S 1 s6w   Y  W dS  tj	y] } zt
d| d|  g W  Y d}~S d}~ww )u   
        获取指定环境的规则列表。
        :param env_id: 环境唯一标识符。
        :return: 与该环境关联的规则对象列表。
        zTSELECT rule_data FROM environment_rules WHERE environment_id = ? ORDER BY rule_orderZ	rule_dataNz$Error getting rules for environment r   )r   rT   rU   rV   rd   r    r^   r@   rY   r[   r%   r)   )	r   rM   r\   rU   re   r   r_   rule_objr-   r   r   r   get_environment_rules   s&   (z!RuleManager.get_environment_rulesN)r
   r   )__name__
__module____qualname____doc__strr   r   r6   r   r   r   r9   r   r>   boolrA   rF   rG   rJ   rL   r]   ra   rc   rg   rh   rk   rm   r   r   r   r   r	      s&    

	"""r	   )r    r   loggingrY   typingr   r   r   r   r   r   basicConfigINFO	getLoggerrn   r%   r	   r   r   r   r   <module>   s    
