def get_email_to_addrs_to_resources_map(self, queue_message): email_to_addrs_to_resources_map = {} targets = queue_message['action']['to'] for resource in queue_message['resources']: # this is the list of emails that will be sent for this resource resource_emails = [] for target in targets: if target.startswith('tag:') and 'tags' in resource: tag_name = target.split(':', 1)[1] result = resource.get('tags', {}).get(tag_name, None) if is_email(result): resource_emails.append(result) elif is_email(target): resource_emails.append(target) resource_emails = tuple(sorted(set(resource_emails))) if resource_emails: email_to_addrs_to_resources_map.setdefault(resource_emails, []).append(resource) if email_to_addrs_to_resources_map == {}: self.logger.debug('Found no email addresses, sending no emails.') # eg: { ('*****@*****.**', '*****@*****.**'): [resource1, resource2, etc] } return email_to_addrs_to_resources_map
def get_event_owner_email(self, targets, event): if 'event-owner' in targets: aws_username = self.get_aws_username_from_event(event) if aws_username: # is using SSO, the target might already be an email if is_email(aws_username): return [aws_username] # if the LDAP config is set, lookup in ldap elif self.config.get('ldap_uri', False): return self.ldap_lookup.get_email_to_addrs_from_uid(aws_username) # the org_domain setting is configured, append the org_domain # to the username from AWS elif self.config.get('org_domain', False): org_domain = self.config.get('org_domain', False) self.logger.info('adding email %s to targets.', aws_username + '@' + org_domain) return [aws_username + '@' + org_domain] else: self.logger.warning('unable to lookup owner email. \ Please configure LDAP or org_domain') else: self.logger.info('no aws username in event') return []
def get_event_owner_email(self, targets, event): if 'event-owner' in targets: aws_username = self.get_aws_username_from_event(event) if aws_username: # is using SSO, the target might already be an email if is_email(aws_username): return [aws_username] # if the LDAP config is set, lookup in ldap elif self.config.get('ldap_uri', False): return self.ldap_lookup.get_email_to_addrs_from_uid( aws_username) # the org_domain setting is configured, append the org_domain # to the username from AWS elif self.config.get('org_domain', False): org_domain = self.config.get('org_domain', False) self.logger.info('adding email %s to targets.', aws_username + '@' + org_domain) return [aws_username + '@' + org_domain] else: self.logger.warning('unable to lookup owner email. \ Please configure LDAP or org_domain') else: self.logger.info('no aws username in event') return []
def get_to_addrs_slack_messages_map(self, sqs_message): resource_list = [] for resource in sqs_message['resources']: resource_list.append(resource) slack_messages = {} # Check for Slack targets in 'to' action and render appropriate template. for target in sqs_message.get('action', ()).get('to'): if target == 'slack://owners': to_addrs_to_resources_map = \ self.email_handler.get_email_to_addrs_to_resources_map(sqs_message) for to_addrs, resources in six.iteritems( to_addrs_to_resources_map): resolved_addrs = self.retrieve_user_im(list(to_addrs)) if not resolved_addrs: continue for address, slack_target in resolved_addrs.items(): slack_messages[address] = get_rendered_jinja( slack_target, sqs_message, resources, self.logger, 'slack_template', 'slack_default', self.config['templates_folders']) self.logger.debug( "Generating messages for recipient list produced by resource owner resolution." ) elif target.startswith('https://hooks.slack.com/'): slack_messages[target] = get_rendered_jinja( target, sqs_message, resource_list, self.logger, 'slack_template', 'slack_default', self.config['templates_folders']) elif target.startswith('slack://webhook/#') and self.config.get( 'slack_webhook'): webhook_target = self.config.get('slack_webhook') slack_messages[webhook_target] = get_rendered_jinja( target.split('slack://webhook/#', 1)[1], sqs_message, resource_list, self.logger, 'slack_template', 'slack_default', self.config['templates_folders']) self.logger.debug("Generating message for webhook %s." % self.config.get('slack_webhook')) elif target.startswith('slack://') and is_email( target.split('slack://', 1)[1]): resolved_addrs = self.retrieve_user_im( [target.split('slack://', 1)[1]]) for address, slack_target in resolved_addrs.items(): slack_messages[address] = get_rendered_jinja( slack_target, sqs_message, resource_list, self.logger, 'slack_template', 'slack_default', self.config['templates_folders']) elif target.startswith('slack://#'): resolved_addrs = target.split('slack://#', 1)[1] slack_messages[resolved_addrs] = get_rendered_jinja( resolved_addrs, sqs_message, resource_list, self.logger, 'slack_template', 'slack_default', self.config['templates_folders']) elif target.startswith('slack://tag/') and 'tags' in resource: tag_name = target.split('tag/', 1)[1] result = resource.get('tags', {}).get(tag_name, None) resolved_addrs = result slack_messages[resolved_addrs] = get_rendered_jinja( resolved_addrs, sqs_message, resource_list, self.logger, 'slack_template', 'slack_default', self.config['templates_folders']) self.logger.debug( "Generating message for specified Slack channel.") return slack_messages
def test_valid_email(self): self.assertFalse(is_email('foobar')) self.assertFalse(is_email('foo@bar')) self.assertFalse(is_email('slack://[email protected]')) self.assertTrue(is_email('*****@*****.**'))
def get_valid_emails_from_list(self, targets): emails = [] for target in targets: if is_email(target): emails.append(target) return emails
def get_to_addrs_slack_messages_map(self, sqs_message): resource_list = [] for resource in sqs_message['resources']: resource_list.append(resource) slack_messages = {} # Check for Slack targets in 'to' action and render appropriate template. for target in sqs_message.get('action', ()).get('to'): if target == 'slack://owners': to_addrs_to_resources_map = \ self.email_handler.get_email_to_addrs_to_resources_map(sqs_message) for to_addrs, resources in six.iteritems(to_addrs_to_resources_map): resolved_addrs = self.retrieve_user_im(list(to_addrs)) if not resolved_addrs: continue for address, slack_target in resolved_addrs.items(): slack_messages[address] = get_rendered_jinja( slack_target, sqs_message, resources, self.logger, 'slack_template', 'slack_default', self.config['templates_folders']) self.logger.debug( "Generating messages for recipient list produced by resource owner resolution.") elif target.startswith('https://hooks.slack.com/'): slack_messages[target] = get_rendered_jinja( target, sqs_message, resource_list, self.logger, 'slack_template', 'slack_default', self.config['templates_folders']) elif target.startswith('slack://webhook/#') and self.config.get('slack_webhook'): webhook_target = self.config.get('slack_webhook') slack_messages[webhook_target] = get_rendered_jinja( target.split('slack://webhook/#', 1)[1], sqs_message, resource_list, self.logger, 'slack_template', 'slack_default', self.config['templates_folders']) self.logger.debug( "Generating message for webhook %s." % self.config.get('slack_webhook')) elif target.startswith('slack://') and is_email(target.split('slack://', 1)[1]): resolved_addrs = self.retrieve_user_im([target.split('slack://', 1)[1]]) for address, slack_target in resolved_addrs.items(): slack_messages[address] = get_rendered_jinja( slack_target, sqs_message, resource_list, self.logger, 'slack_template', 'slack_default', self.config['templates_folders']) elif target.startswith('slack://#'): resolved_addrs = target.split('slack://#', 1)[1] slack_messages[resolved_addrs] = get_rendered_jinja( resolved_addrs, sqs_message, resource_list, self.logger, 'slack_template', 'slack_default', self.config['templates_folders']) elif target.startswith('slack://tag/') and 'tags' in resource: tag_name = target.split('tag/', 1)[1] result = resource.get('tags', {}).get(tag_name, None) resolved_addrs = result slack_messages[resolved_addrs] = get_rendered_jinja( resolved_addrs, sqs_message, resource_list, self.logger, 'slack_template', 'slack_default', self.config['templates_folders']) self.logger.debug("Generating message for specified Slack channel.") return slack_messages