
    h`)                         S SK r S SKrS SKrS SKrS SKJrJrJrJr  S SK	J
r
  \R                  " \R                  SS9  \R                  " \5      r " S S5      rg)    N)ListDictAnyOptional)get_db_managerz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)levelformatc                      \ rS rSrSrSS\S\4S jjrS rS rS\	\
\\4      4S	 jrS
\S\\
\\4      4S jrS\
\\4   S\4S jrS
\S\
\\4   S\4S jrS
\S\4S jrS
\S\4S jrS
\S\4S jrS\S\S\
\\4   S\4S jrS\S\\
\\4      4S jrS\	\
\\4      4S jrS\S\4S jrS\S\	\
\\4      S\4S jrS\S\	\
\\4      4S jrSrg) RuleManager   u>   
规则管理器，负责规则的增删改查和持久化。
db_path
rules_filec                     X l         / U l        [        5       U l        US:w  a  SSKJn  U" U5      U l        U R                  5         g )Ndata/honeypot.dbr   )DatabaseManager)r   rulesr   
db_managercore.databaser   _load_rules)selfr   r   r   s       core/rule_manager.py__init__RuleManager.__init__   s<    $+-
(*((5-g6DO    c                    [         R                  R                  U R                  5      (       a   [	        U R                  SSS9 n[
        R                  " U5      n[        U[        5      (       a  UR                  S/ 5      O/ U l
        SSS5        [        R                  S[        U R                  5       SU R                   35        g[        R!                  S
U R                   S35        / U l
        g! , (       d  f       Nr= f! [         a6  n[        R                  SU R                   S	U 35        / U l
         SnAgSnAff = f)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   RuleManager._load_rules   s    77>>$//** $//3AQ99Q<D:DT4:P:P'2!6VXDJ B gc$**o%66I$//IZ[\
 NN[(99hijDJ BA
   9$//9J"QCPQ

 s1   D AC6
A D 6
D D 
E,EEc                 
    [         R                  " [         R                  R                  U R                  5      SS9  [        U R                  SSS9 n[        R                  " SU R                  0USSS	9  [        R                  S
[        U R                  5       SU R                   35        SSS5        g! , (       d  f       g= f! [         a/  n[        R                  SU R                   SU 35         SnAgSnAff = f)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   r0   r2   s      r   _save_rules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B8/C	 8
CC	 C	 	
D%C==Dreturnc                 6    U R                   R                  5       $ )u   获取所有全局规则)r   copy)r   s    r   get_all_rulesRuleManager.get_all_rules7   s    zz  r   rule_idc                 \    U R                    H  nUR                  S5      U:X  d  M  Us  $    g)u   根据ID获取全局规则idN)r   r)   r   rD   rules      r   get_rule_by_idRuleManager.get_rule_by_id;   s*    JJDxx~(  r   rH   c                    UR                  S5      (       d  [        R                  S5        gU R                  US   5      (       a  [        R                  SUS    S35        gU R                  R                  U5        U R                  5         g)u   添加新全局规则rF   zRule must have an 'id'FRule with ID 'z' already existsT)r)   r*   r.   rI   r   appendr=   )r   rH   s     r   add_ruleRuleManager.add_ruleB   sr    xx~~LL12tDz**LL>$t*5EFG

$r   updated_rulec                     [        U R                  5       H:  u  p4UR                  S5      U:X  d  M  X R                  U'   U R                  5           g   [        R                  SU S35        g)u   更新全局规则rF   TrL   z' not found for updateF	enumerater   r)   r=   r*   r/   )r   rD   rP   irH   s        r   update_ruleRuleManager.update_ruleO   s\     ,GAxx~( ,

1  "	 -
 	y0FGHr   c                     [        U R                  5       H9  u  p#UR                  S5      U:X  d  M  U R                  U	 U R                  5           g   [        R                  SU S35        g)u   删除全局规则rF   TrL   z' not found for deletionFrR   )r   rD   rT   rH   s       r   delete_ruleRuleManager.delete_ruleY   s\     ,GAxx~(JJqM  "	 -
 	y0HIJr   c                 `    U R                  U5      nU(       a  SUS'   U R                  5         gg)u   启用全局规则TenabledFrI   r=   rG   s      r   enable_ruleRuleManager.enable_rulec   s0    ""7+"DOr   c                 `    U R                  U5      nU(       a  SUS'   U R                  5         gg)u   禁用全局规则Fr[   Tr\   rG   s      r   disable_ruleRuleManager.disable_rulel   s0    ""7+#DOr   env_iddriverconfigc                     U R                   R                  5        nUR                  5       nUR                  SX[        R
                  " USS945        UR                  5         [        R                  SU S35         SSS5        g! , (       d  f       g= f! [        R                   a    [        R                  SU S35         g[        R                   a%  n[        R                  S	U S
U 35         SnAgSnAff = f)u   
在数据库中创建一个新环境。
:param env_id: 环境唯一标识符。
:param driver: 使用的驱动名称。
:param config: 环境配置字典。
:return: 操作是否成功。
z>INSERT INTO environments (id, driver, config) VALUES (?, ?, ?)Fr8   Environment z created in database.NTz already exists in database.zError creating environment r    )r   get_connectioncursorexecuter%   dumpscommitr*   r+   sqlite3IntegrityErrorr/   Errorr.   )r   rb   rc   rd   connri   r2   s          r   create_environmentRuleManager.create_environmentw   s    	//1TTTZZU%KL 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?C::C?c                     U R                   R                  5        nUR                  5       nUR                  SU45        UR	                  5       nU(       a2  [        U5      n[        R                  " US   5      US'   UsSSS5        $  SSS5        g! , (       d  f       g= f! [        R                   a%  n[        R                  SU SU 35         SnAgSnAff = f)u   
从数据库获取环境信息。
:param env_id: 环境唯一标识符。
:return: 环境信息字典，如果未找到则返回 None。
z'SELECT * FROM environments WHERE id = ?rd   NzError getting environment r    )r   rh   ri   rj   fetchoner(   r%   loadsrm   ro   r*   r.   )r   rb   rp   ri   rowenv_datar2   s          r   get_environmentRuleManager.get_environment   s    	E//1TH6)Too'#CyH)-HX4F)GHX&# 21 	 2  21  }} 	ELL5fXRsCDD	Es;   B$ A#B?	B$ 
B$ 
B!B$ !B$ $C8CCc                     U R                   R                  5        nUR                  5       nUR                  S5        UR	                  5       n/ nU H;  n[        U5      n[        R                  " US   5      US'   UR                  U5        M=     UsSSS5        $ ! , (       d  f       g= f! [        R                   a$  n[        R                  SU 35        / s SnA$ SnAff = f)uH   
从数据库列出所有环境。
:return: 环境信息字典列表。
zSELECT * FROM environmentsrd   NzError listing environments: )r   rh   ri   rj   fetchallr(   r%   ru   rM   rm   ro   r*   r.   )r   rp   ri   rowsenvironmentsrv   rw   r2   s           r   list_environmentsRuleManager.list_environments   s    
	//1T;<(!C#CyH)-HX4F)GHX& ''1	  
 $ 211 }} 	LL7s;<I	s;   B- A6B	B- 
B*&B- *B- -C%C C% C%c                     U R                   R                  5        nUR                  5       nUR                  SU45        UR	                  5         UR
                  S:  a#  [        R                  SU S35         SSS5        g[        R                  SU S35         SSS5        g! , (       d  f       g= f! [        R                   a%  n[        R                  S	U S
U 35         SnAgSnAff = f)u   
从数据库删除环境。由于设置了 CASCADE，environment_rules 表中的相关记录也会被自动删除。
:param env_id: 环境唯一标识符。
:return: 操作是否成功。
z%DELETE FROM environments WHERE id = ?r   rg   z deleted from database.NTz not found for deletion.FzError deleting environment r    )r   rh   ri   rj   rl   rowcountr*   r+   r/   rm   ro   r.   )r   rb   rp   ri   r2   s        r   delete_environment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   B7 AB&:B7 B&B7 &
B40B7 4B7 7C0C++C0r   c                     U R                   R                  5        nUR                  5       nUR                  SU45        [	        U5       H.  u  pV[
        R                  " USS9nUR                  SXU45        M0     UR                  5         [        R                  S[        U5       SU S35         SSS5        g	! , (       d  f       g= f! [        R                   a%  n[        R                  S
U SU 35         SnAgSnAff = f)u   
为指定环境设置（覆盖）规则列表。
:param env_id: 环境唯一标识符。
:param rules: 要关联到环境的规则对象列表。
:return: 操作是否成功。
z6DELETE FROM environment_rules WHERE environment_id = ?Frf   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   rh   ri   rj   rS   r%   rk   rl   r*   r+   r,   rm   ro   r.   )	r   rb   r   rp   ri   indexrH   	rule_jsonr2   s	            r   set_environment_rules!RuleManager.set_environment_rules   s    	//1TWZ`Ybc $-U#3KE $

4e DINNpE2 $4 d3u:,.EfXQOP 211  }} 	LL?xr!MN	s5   C BB<3C <
C
C 
C D!DDc                     U R                   R                  5        nUR                  5       nUR                  SU45        UR	                  5       n/ nU H-  n[
        R                  " US   5      nUR                  U5        M/     UsSSS5        $ ! , (       d  f       g= f! [        R                   a'  n[        R                  SU SU 35        / s SnA$ SnAff = f)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   rh   ri   rj   r{   r%   ru   rM   rm   ro   r*   r.   )	r   rb   rp   ri   r|   r   rv   rule_objr2   s	            r   get_environment_rules!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5CCC)r   r   r   N)r   zconfig/rules.json)__name__
__module____qualname____firstlineno____doc__strr   r   r=   r   r   r   rB   r   rI   boolrN   rU   rX   r]   r`   rq   rx   r~   r   r   r   __static_attributes__ 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 (4S#X#7 *  *C T#s(^8L QU 8C Dc3h4H r   r   )r%   r!   loggingrm   typingr   r   r   r   r   r   basicConfigINFO	getLoggerr   r*   r   r   r   r   <module>r      sM     	   , , (   ',,/e f			8	$v vr   