Skip to content

Commit d9f7f58

Browse files
authored
Merge pull request #9 from michaelaberman/master
add --disable_email option
2 parents ff55798 + 215447c commit d9f7f58

File tree

3 files changed

+98
-67
lines changed

3 files changed

+98
-67
lines changed

README.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,8 @@ arguments:
198198
accounts to the behavior graph. If the master account already has a behavior graph in a Region, then
199199
the member accounts are added to that behavior graph. If you do not provide a list of Regions, then
200200
the script acts across all Regions that Detective supports.
201-
201+
--disable_email If this flag is included, then emails will not be sent to the member accounts. Member accounts must still accept
202+
the invitation before they are added to the behavior graph.
202203
```
203204

204205

@@ -237,3 +238,15 @@ arguments:
237238
behavior graphs, the script disables Detective for the master account in all of the specified Regions.
238239
When Detective is disabled for a master account, the master account's behavior graph is disabled.
239240
```
241+
242+
## Contributing to this project
243+
244+
### Running tests
245+
246+
```
247+
# Install requirements
248+
pip3 install boto3 pytest
249+
250+
# In the tests/ directory...
251+
pytest -s
252+
```

enableDetective.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ def _master_account_type(val: str, pattern: str = r'[0-9]{12}'):
5757
parser.add_argument('--enabled_regions', type=str,
5858
help=('Regions to enable Detective. If not specified, '
5959
'all available regions enabled.'))
60+
parser.add_argument('--disable_email', action='store_true',
61+
help=('Don\'t send emails to the member accounts. Member '
62+
'accounts must still accept the invitation before '
63+
'they are added to the behavior graph.'))
6064
return parser.parse_args(args)
6165

6266

@@ -228,7 +232,7 @@ def _master_memberList(g: str) -> typing.List[typing.Dict]:
228232
{g: {x['AccountId'] for x in v if x['Status'] == 'INVITED'} for g, v in pending})
229233

230234

231-
def create_members(d_client: botocore.client.BaseClient, graph_arn: str, account_ids: typing.Set[str],
235+
def create_members(d_client: botocore.client.BaseClient, graph_arn: str, disable_email: bool, account_ids: typing.Set[str],
232236
account_csv: typing.Dict[str, str]) -> typing.Set[str]:
233237
"""
234238
Creates member accounts for all accounts in the csv that are not present in the graph member set.
@@ -257,7 +261,8 @@ def create_members(d_client: botocore.client.BaseClient, graph_arn: str, account
257261
for x in set_difference]
258262
response = d_client.create_members(GraphArn=graph_arn,
259263
Message='Automatically generated invitation',
260-
Accounts=new_members)
264+
Accounts=new_members,
265+
DisableEmailNotification=disable_email)
261266
for error in response['UnprocessedAccounts']:
262267
logging.exception(f'Could not create member for account {error["AccountId"]} in '
263268
f'graph {graph_arn}: {error["Reason"]}')
@@ -336,7 +341,7 @@ def enable_detective(d_client: botocore.client.BaseClient, region: str):
336341

337342
for graph, members in all_members.items():
338343
new_accounts = create_members(
339-
d_client, graph, members, aws_account_dict)
344+
d_client, graph, args.disable_email, members, aws_account_dict)
340345
print("Sleeping for 5s to allow new members' invitations to propagate.")
341346
time.sleep(5)
342347
accept_invitations(args.assume_role, itertools.chain(

0 commit comments

Comments
 (0)