
    %hh,                         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        ej                  e      Z G d d      Zy)    N)ListDictAnyOptional)get_db_managerz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)levelformatc                      e Zd ZdZddedefdZd Zd Zdee	ee
f      fdZd	edee	ee
f      fd
Zde	ee
f   defdZd	ede	ee
f   defdZd	edefdZd	edefdZd	edefdZdedede	ee
f   defdZdedee	ee
f      fdZdededefdZdee	ee
f      fdZdedefdZdedee	ee
f      defdZdedee	ee
f      fdZy) RuleManageruF   
    规则管理器，负责规则的增删改查和持久化。
    db_path
rules_filec                     || _         g | _        t               | _        |dk7  rddlm}  ||      | _        | j                          y )Ndata/honeypot.dbr   )DatabaseManager)r   rulesr   
db_managercore.databaser   _load_rules)selfr   r   r   s       %D:\code\IVE2\IVE\core\rule_manager.py__init__zRuleManager.__init__   s>    $+-
(*((5-g6DO    c                 x   t         j                  j                  | j                        r	 t	        | j                  dd      5 }t        j                  |      }t        |t              r|j                  dg       ng | _
        ddd       t        j                  dt        | j                         d| j                          yt        j!                  d
| j                   d       g | _
        y# 1 sw Y   mxY w# t        $ r6}t        j                  d| j                   d	|        g | _
        Y d}~yd}~ww xY w)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es       r   r   zRuleManager._load_rules   s    77>>$//* $//3AQ99Q<D:DT4:P'2!6VXDJ B gc$**o%66I$//IZ[\
 NN[(99hijDJ BA
   9$//9J"QCPQ

 s0   C: ?C.A C: .C73C: :	D9,D44D9c                    	 t        j                  t         j                  j                  | j                        d       t        | j                  dd      5 }t        j                  d| j                  i|dd	       t        j                  d
t        | j                         d| j                          ddd       y# 1 sw Y   yxY w# t        $ r/}t        j                  d| j                   d|        Y d}~yd}~ww xY 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.   r0   s      r   _save_ruleszRuleManager._save_rules,   s    	LKK84HdoosW=		7DJJ/qQfS_$55FtFWXY >==  	LLL3DOO3DBqcJKK	Ls7   AC AB?6C ?CC C 	D%C>>Dreturnc                 6    | j                   j                         S )u   获取所有全局规则)r   copy)r   s    r   get_all_ruleszRuleManager.get_all_rules7   s    zz  r   rule_idc                 V    | j                   D ]  }|j                  d      |k(  s|c S  y)u   根据ID获取全局规则idN)r   r'   r   r?   rules      r   get_rule_by_idzRuleManager.get_rule_by_id;   s*    JJDxx~(  r   rC   c                 
   |j                  d      st        j                  d       y| j                  |d         rt        j                  d|d    d       y| j                  j                  |       | j                          y)u   添加新全局规则rA   zRule must have an 'id'FRule with ID 'z' already existsT)r'   r(   r,   rD   r   appendr:   )r   rC   s     r   add_rulezRuleManager.add_ruleB   sm    xx~LL12tDz*LL>$t*5EFG

$r   updated_rulec                     t        | j                        D ]:  \  }}|j                  d      |k(  s|| j                  |<   | j                           y t        j                  d| d       y)u   更新全局规则rA   TrF   z' not found for updateF	enumerater   r'   r:   r(   r-   )r   r?   rI   irC   s        r   update_rulezRuleManager.update_ruleO   s`     ,GAtxx~( ,

1  "	 -
 	y0FGHr   c                     t        | j                        D ]8  \  }}|j                  d      |k(  s| j                  |= | j                           y t        j                  d| d       y)u   删除全局规则rA   TrF   z' not found for deletionFrK   )r   r?   rM   rC   s       r   delete_rulezRuleManager.delete_ruleY   s^     ,GAtxx~(JJqM  "	 -
 	y0HIJr   c                 V    | j                  |      }|rd|d<   | j                          yy)u   启用全局规则TenabledFrD   r:   rB   s      r   enable_rulezRuleManager.enable_rulec   s0    ""7+"DOr   c                 V    | j                  |      }|rd|d<   | j                          yy)u   禁用全局规则FrR   TrS   rB   s      r   disable_rulezRuleManager.disable_rulel   s0    ""7+#DOr   env_iddriverconfigc           
         	 | j                   j                         5 }|j                         }|j                  d||t	        j
                  |d      df       |j                          t        j                  d| d       	 ddd       y# 1 sw Y   yxY w# t        j                  $ r t        j                  d| d	       Y yt        j                  $ r%}t        j                  d
| d|        Y d}~yd}~ww xY w)u   
        在数据库中创建一个新环境。
        :param env_id: 环境唯一标识符。
        :param driver: 使用的驱动名称。
        :param config: 环境配置字典。
        :return: 操作是否成功。
        zIINSERT INTO environments (id, driver, config, status) VALUES (?, ?, ?, ?)Fr5   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   rW   rX   rY   connr`   r0   s          r   create_environmentzRuleManager.create_environmentw   s    	//1T_VTZZU%KYW l6(2GHI 211 %% 	NN\&1MNO}} 	LL6vhbDE	s;   B A&BB BB B ,C<C<C77C<c                    	 | j                   j                         5 }|j                         }|j                  d|f       |j	                         }|r1t        |      }t        j                  |d         |d<   |cddd       S 	 ddd       y# 1 sw Y   yxY w# t        j                  $ r%}t        j                  d| d|        Y d}~yd}~ww xY w)u   
        从数据库获取环境信息。
        :param env_id: 环境唯一标识符。
        :return: 环境信息字典，如果未找到则返回 None。
        z'SELECT * FROM environments WHERE id = ?rY   NzError getting environment r   )r   r_   r`   ra   fetchoner&   r#   loadsrd   rf   r(   r,   )r   rW   rg   r`   rowenv_datar0   s          r   get_environmentzRuleManager.get_environment   s    	E//1TH6)Too'#CyH)-HX4F)GHX&# 21 	 2  2  }} 	ELL5fXRsCDD	Es;   B AB9	B B BB B C,CCstatusc                    	 | j                   j                         5 }|j                         }|j                  d||f       |j	                          t
        j                  d| d       	 d d d        y# 1 sw Y   y xY w# t        j                  $ r t
        j                  d| d       Y yt        j                  $ r%}t
        j                  d| d|        Y d }~yd }~ww xY w)	Nz/UPDATE environments set status = ? where id = ?r]   z update in database.Tr^   FzError updateing environment r   )r   r_   r`   ra   rc   r(   r)   rd   re   r-   rf   r,   )r   rW   ro   rg   r`   r0   s         r   update_environmentzRuleManager.update_environment   s    	//1TEV$ l6(2FGH 211 %% 	NN\&1MNO}} 	LL7xr!EF	s;   B  AA4+B  4A=9B  =B   ,C%.C% C  C%c                    	 | j                   j                         5 }|j                         }|j                  d       |j	                         }g }|D ]9  }t        |      }t        j                  |d         |d<   |j                  |       ; |cddd       S # 1 sw Y   yxY w# t        j                  $ r$}t        j                  d|        g cY d}~S d}~ww xY w)u`   
        从数据库列出所有环境。
        :return: 环境信息字典列表。
        zSELECT * FROM environmentsrY   NzError listing environments: )r   r_   r`   ra   fetchallr&   r#   rk   rG   rd   rf   r(   r,   )r   rg   r`   rowsenvironmentsrl   rm   r0   s           r   list_environmentszRuleManager.list_environments   s    
	//1T;<(!C#CyH)-HX4F)GHX& ''1	  
 $ 211 }} 	LL7s;<I	s;   B% A3B	B% B"B% "B% %C8CCCc                    	 | j                   j                         5 }|j                         }|j                  d|f       |j	                          |j
                  dkD  r#t        j                  d| d       	 ddd       yt        j                  d| d       	 ddd       y# 1 sw Y   yxY w# t        j                  $ r%}t        j                  d	| d
|        Y d}~yd}~ww xY w)u   
        从数据库删除环境。由于设置了 CASCADE，environment_rules 表中的相关记录也会被自动删除。
        :param env_id: 环境唯一标识符。
        :return: 操作是否成功。
        z%DELETE FROM environments WHERE id = ?r   r]   z deleted from database.NTz not found for deletion.FzError deleting environment r   )r   r_   r`   ra   rc   rowcountr(   r)   r-   rd   rf   r,   )r   rW   rg   r`   r0   s        r   delete_environmentzRuleManager.delete_environment   s    	//1TF	R??Q&KK,vh6M NO 21 NN\&9Q#RS  211 }} 	LL6vhbDE	sA   B1 AB%9B1 B%B1 %B.*B1 .B1 1C)C$$C)r   c                 
   	 | j                   j                         5 }|j                         }|j                  d|f       t	        |      D ]1  \  }}t        j                  |d      }|j                  d|||f       3 |j                          t        j                  dt        |       d| d       	 ddd       y	# 1 sw Y   yxY w# t        j                  $ r%}t        j                  d
| d|        Y d}~yd}~ww xY w)u   
        为指定环境设置（覆盖）规则列表。
        :param env_id: 环境唯一标识符。
        :param rules: 要关联到环境的规则对象列表。
        :return: 操作是否成功。
        z6DELETE FROM environment_rules WHERE environment_id = ?Fr[   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   r_   r`   ra   rL   r#   rb   rc   r(   r)   r*   rd   rf   r,   )	r   rW   r   rg   r`   indexrC   	rule_jsonr0   s	            r   set_environment_rulesz!RuleManager.set_environment_rules   s    	//1TWZ`Ybc $-U#3KE4 $

4e DINNpE2 $4 d3u:,.EfXQOP 211  }} 	LL?xr!MN	s5   C
 BB>5C
 >CC
 C
 
DC==Dc                    	 | j                   j                         5 }|j                         }|j                  d|f       |j	                         }g }|D ]+  }t        j                  |d         }|j                  |       - |cddd       S # 1 sw Y   yxY w# t        j                  $ r'}t        j                  d| d|        g cY d}~S d}~ww xY w)u   
        获取指定环境的规则列表。
        :param env_id: 环境唯一标识符。
        :return: 与该环境关联的规则对象列表。
        zTSELECT rule_data FROM environment_rules WHERE environment_id = ? ORDER BY rule_order	rule_dataNz$Error getting rules for environment r   )r   r_   r`   ra   rs   r#   rk   rG   rd   rf   r(   r,   )	r   rW   rg   r`   rt   r   rl   rule_objr0   s	            r   get_environment_rulesz!RuleManager.get_environment_rules   s    	//1TjI (C#zz#k*:;HLL*    211 }} 	LL?xr!MN I		s;   B A'B	B BB B C,CCCN)r   zconfig/rules.json)__name__
__module____qualname____doc__strr   r   r:   r   r   r   r>   r   rD   boolrH   rN   rP   rT   rV   rh   rn   rq   rv   ry   r~   r    r   r   r   r      s   	 	c 	 	L!tDcN3 !c htCH~.F T#s(^  3 d38n  3 4 3 4 C D  c 4S> VZ 2c htCH~.F * c d &4S#X#7 *  *C T#s(^8L QU 8C Dc3h4H r   r   )r#   r   loggingrd   typingr   r   r   r   r   r   basicConfigINFO	getLoggerr   r(   r   r   r   r   <module>r      sQ     	   , , (   ',,/e f			8	$J Jr   