1+ from py42 .exceptions import Py42InternalServerError
12from py42 .util import format_json
23
4+
5+ from code42cli .errors import InvalidRuleTypeError
36from code42cli .util import format_to_table , find_format_width
47from code42cli .bulk import run_bulk_process , CSVReader
58from code42cli .logger import get_main_cli_logger
1922
2023def add_user (sdk , profile , rule_id , username ):
2124 user_id = get_user_id (sdk , username )
22- sdk .alerts .rules .add_user (rule_id , user_id )
25+ rules = _get_rule_metadata (sdk , rule_id )
26+ try :
27+ if rules :
28+ sdk .alerts .rules .add_user (rule_id , user_id )
29+ except Py42InternalServerError as e :
30+ _check_if_system_rule (sdk , rules )
31+ raise
2332
2433
2534def remove_user (sdk , profile , rule_id , username ):
26- if username :
27- user_id = get_user_id (sdk , username )
28- sdk .alerts .rules .remove_user (rule_id , user_id )
29- else :
30- sdk .alerts .rules .remove_all_users (rule_id )
35+ user_id = get_user_id (sdk , username )
36+ rules = _get_rule_metadata (sdk , rule_id )
37+ try :
38+ if rules :
39+ sdk .alerts .rules .remove_user (rule_id , user_id )
40+ except Py42InternalServerError as e :
41+ _check_if_system_rule (sdk , rules )
42+ raise
3143
3244
33- def _get_rules_metadata (sdk , rule_id = None ):
45+ def _get_all_rules_metadata (sdk ):
3446 rules_generator = sdk .alerts .rules .get_all ()
3547 selected_rules = [rule for rules in rules_generator for rule in rules [u"ruleMetadata" ]]
36- if rule_id :
37- selected_rules = [rule for rule in selected_rules if rule [u"observerRuleId" ] == rule_id ]
38- return selected_rules
48+ return _handle_rules_results (sdk , selected_rules )
49+
50+
51+ def _get_rule_metadata (sdk , rule_id ):
52+ rules = sdk .alerts .rules .get_by_observer_id (rule_id )[u"ruleMetadata" ]
53+ return _handle_rules_results (sdk , rules , rule_id )
54+
55+
56+ def _handle_rules_results (sdk , rules , rule_id = None ):
57+ id_msg = u"with RuleId {} " .format (rule_id ) if rule_id else u""
58+ msg = u"No alert rules {0}found." .format (id_msg )
59+ if not rules :
60+ get_main_cli_logger ().print_and_log_info (msg )
61+ return rules
62+
63+
64+ def _check_if_system_rule (sdk , rules ):
65+ if rules and rules [0 ][u"isSystem" ]:
66+ raise InvalidRuleTypeError (rules [0 ][u"observerRuleId" ], rules [0 ][u"ruleSource" ])
3967
4068
4169def get_rules (sdk , profile ):
42- selected_rules = _get_rules_metadata (sdk )
43- rows , column_size = find_format_width (selected_rules , _HEADER_KEYS_MAP )
44- format_to_table (rows , column_size )
70+ selected_rules = _get_all_rules_metadata (sdk )
71+ if selected_rules :
72+ rows , column_size = find_format_width (selected_rules , _HEADER_KEYS_MAP )
73+ format_to_table (rows , column_size )
4574
4675
4776def add_bulk_users (sdk , profile , file_name ):
@@ -59,9 +88,9 @@ def remove_bulk_users(sdk, profile, file_name):
5988
6089
6190def show_rule (sdk , profile , rule_id ):
62- selected_rule = _get_rules_metadata (sdk , rule_id )
91+ selected_rule = _get_rule_metadata (sdk , rule_id )
6392 rule_detail = None
64- if len ( selected_rule ) :
93+ if selected_rule :
6594 rule_type = selected_rule [0 ][u"type" ]
6695 if rule_type == AlertRuleTypes .EXFILTRATION :
6796 rule_detail = sdk .alerts .rules .exfiltration .get (rule_id )
0 commit comments