88
99from intelmq .lib .bot import ExpertBot
1010from intelmq import VAR_STATE_PATH
11+ from intelmq .lib .message import Event
1112
1213
1314class FakeExpertBot (ExpertBot ):
@@ -18,30 +19,58 @@ class FakeExpertBot(ExpertBot):
1819
1920 def init (self ):
2021 with open (self .database ) as database :
21- self .networks = json_load (database )['ip_network' ]
22+ database = json_load (database )
23+ self .ip_networks = database .get ('ip_network' , [])
24+ self .event_fields = database .get ('event_fields' , {})
2225
2326 def process (self ):
2427 event = self .receive_message ()
25- network = choice (self .networks )
28+ if self .ip_networks :
29+ network = choice (self .ip_networks )
2630
27- updated = False
28- try :
29- updated = event .add ('source.ip' , ip_network (network )[1 ], overwrite = self .overwrite )
30- except IndexError :
31- updated = event .add ('source.ip' , ip_network (network )[0 ], overwrite = self .overwrite )
32- # For consistency, only set the network if the source.ip was set or overwritten, but then always overwrite it
33- if updated :
34- event .add ('source.network' , network , overwrite = True )
31+ updated = False
32+ try :
33+ updated = event .add ('source.ip' , ip_network (network )[1 ], overwrite = self .overwrite )
34+ except IndexError :
35+ updated = event .add ('source.ip' , ip_network (network )[0 ], overwrite = self .overwrite )
36+ # For consistency, only set the network if the source.ip was set or overwritten, but then always overwrite it
37+ if updated :
38+ event .add ('source.network' , network , overwrite = True )
39+
40+ for fieldname , field in self .event_fields .items ():
41+ if field ['mode' ] == 'random_single_value' :
42+ event .add (fieldname , choice (field ['values' ]), overwrite = self .overwrite )
43+ else :
44+ raise ValueError (f"Mode { field ['mode' ]} not supported in field { fieldname } ." )
3545
3646 self .send_message (event )
3747 self .acknowledge_message ()
3848
3949 def check (parameters : dict ):
4050 try :
4151 with open (parameters ['database' ]) as database :
42- json_load (database )[ 'ip_network' ]
52+ database = json_load (database )
4353 except Exception as exc :
44- return [['error' , exc ]]
54+ return [['error' , f"Could not load database: { exc } " ]]
55+ errors = []
56+ if not isinstance (database .get ('ip_network' , []), list ):
57+ errors .append (['error' , 'ip_network is not of type list' ])
58+ if not isinstance (database .get ('event_fields' , {}), dict ):
59+ errors .append (['error' , 'event_fields is not of type dict' ])
60+ else :
61+ test_event = Event ()
62+ for fieldname , field in database .get ('event_fields' , {}).items ():
63+ fieldname_check = test_event ._Message__is_valid_key (fieldname )
64+ if not fieldname_check [0 ]:
65+ errors .append (['error' , f"Field name { fieldname } is not valid: { fieldname_check [1 ]} ." ])
66+ mode = field .get ('mode' )
67+ if mode not in ('random_single_value' , ):
68+ errors .append (['error' , f"Mode { mode } not supported in field { fieldname } ." ])
69+ if 'values' not in field :
70+ errors .append (['error' , f"No values defined in field { fieldname } ." ])
71+ elif not isinstance (field ['values' ], list ):
72+ errors .append (['error' , f"Values is not a list in field { fieldname } ." ])
73+ return errors if errors else None
4574
4675
4776BOT = FakeExpertBot
0 commit comments