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