Advertisement
billabong

Untitled

Oct 5th, 2018
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.96 KB | None | 0 0
  1. # encoding = utf-8
  2.  
  3. import os
  4. import sys
  5. import time
  6. import datetime
  7. import json
  8. from collections import OrderedDict
  9. import boto3
  10. #import common
  11. from botocore.exceptions import EndpointConnectionError
  12. from botocore.exceptions import ClientError
  13. from splunk.clilib import cli_common as cli
  14.  
  15.  
  16.  
  17. def merge_metadata(result, check_metadata):
  18.     """
  19.    Merging the metadata from checks and description endpoints
  20.    :param result:
  21.    :param check_metadata:
  22.    :return: merged, merged_html
  23.    """
  24.     merged = []
  25.     merged_html = []
  26.     container = get_cleaned_metadata_values(result)
  27.  
  28.     check_metadata.append("-") # some are missing a header?
  29.     for row in container:
  30.         for h, v in zip(check_metadata, row):
  31.             header = h or "-"
  32.             value = v or " "
  33.             if isinstance(value, (list,)):
  34.                 value = ", ".join(value)
  35.             meta = header + ": " + value + ","
  36.             if 'Green' in value or 'Yellow' in value or 'Red' in value:
  37.                 header = 'Status'
  38.                 meta_html = '<p class="' + value.lower() + ' status">' + '<b>' + header + \
  39.                             ':</b> ' + value + '</p>'
  40.             else:
  41.                 meta_html = '<p>' + '<b>' + header + ':</b> ' + value + '</p>'
  42.             merged.append(meta)
  43.             merged_html.append(meta_html)
  44.         merged.append('---')
  45.         merged_html.append('---')
  46.     return merged, merged_html
  47.  
  48.  
  49. def get_cleaned_metadata_values(result):
  50.     """
  51.    Goes through metadata values and cleans them, specifically if there are buckets it merges them into one list
  52.    :param result:
  53.    :return: container
  54.    """
  55.     container = []
  56.     for flagged in result:
  57.         for k_flagged, v_flagged in flagged.iteritems():
  58.             if k_flagged == 'metadata':
  59.                 if v_flagged[0]:
  60.                     container.append(v_flagged)
  61.                 else:
  62.                     buckets = container[-1][-1]
  63.  
  64.                     if buckets is None:
  65.                         buckets = []
  66.                     buckets.append(v_flagged[-1])
  67.                     container[-1][-1] = buckets
  68.     return container
  69.  
  70.  
  71. def newer_timestamp(checkpoint, timestamp):
  72.     """ Check if timestamp is newer """
  73.     checkpoint = checkpoint.split('T')[0]
  74.     timestamp = timestamp.split('T')[0]
  75.     checkpoint_dt = datetime.datetime.strptime(checkpoint, '%Y-%m-%d')
  76.     timestamp_dt = datetime.datetime.strptime(timestamp, '%Y-%m-%d')
  77.     return bool(timestamp_dt > checkpoint_dt)
  78.  
  79.  
  80. def validate_input(helper, definition):
  81.     """Implement your own validation logic to validate the input stanza configurations"""
  82.     # This example accesses the modular input variable
  83.     # input_friendly_name = definition.parameters.get('input_friendly_name', None)
  84.     # profile = definition.parameters.get('profile', None)
  85.     pass
  86.  
  87.  
  88. def authenticate(helper):
  89.     """
  90.    Authenticates against AWS
  91.    :return: aws_client
  92.    """
  93.  
  94.     access_key_id=helper.get_arg('aws_access_key')
  95.     secret_access_key=helper.get_arg('aws_secret_key')
  96.     session_token=None
  97.  
  98.  
  99.     role_arn = helper.get_arg('role_arn')
  100.     if role_arn:
  101.         audit_sts_client = boto3.client('sts')
  102.         sts_response = boto3.client('sts').assume_role(
  103.             RoleArn=role_arn,
  104.             RoleSessionName="splunk",
  105.             DurationSeconds=900 #min 900 max inf
  106.         )
  107.  
  108.         sts_credentials = sts_response['Credentials']
  109.         access_key_id = sts_credentials['AccessKeyId']
  110.         secret_access_key = sts_credentials['SecretAccessKey']
  111.         session_token = sts_credentials['SessionToken']
  112.         helper.log_debug("Assumed role={}".format(role_arn))
  113.  
  114.     region = 'us-east-1'
  115.     try:
  116.         aws_client = boto3.client(
  117.             'support',
  118.             region_name=region,
  119.             aws_access_key_id=access_key_id,
  120.             aws_secret_access_key=secret_access_key,
  121.             aws_session_token=session_token
  122.         )
  123.         return aws_client
  124.     except EndpointConnectionError as e:
  125.         message = '{}'.format(e)
  126.         helper.log_critical(message)
  127.     except ClientError as e:
  128.         message = '{}'.format(e)
  129.         helper.log_critical(message)
  130.  
  131.  
  132. def get_trusted_advisor_checks(client):
  133.     """
  134.    Creates a list of dicts containg check information
  135.    [{checkId: <val>, metadata: <val>}, ...]
  136.    :return: checks
  137.    :param client
  138.    """
  139.     checks = []
  140.     ta_checks = client.describe_trusted_advisor_checks(
  141.         language='en'
  142.     )
  143.     for check in ta_checks["checks"]:
  144.         checks.append({'checkId': check['id'], 'metadata': check['metadata']})
  145.     return checks
  146.  
  147.  
  148. def get_check_result(client, check_id):
  149.     """
  150.    Pulls results for a specific check by the checkId
  151.    :param check_id:
  152.    :param client
  153.    :return: result
  154.    """
  155.     result = client.describe_trusted_advisor_check_result(
  156.         checkId=check_id,
  157.         language='en'
  158.     )['result']
  159.     return result
  160.  
  161.  
  162.  
  163. def loop_checks(client, checks, helper, ew):
  164.     """
  165.    Loops through checks; gets results for each check and determines if there is a newer event
  166.    :param checks:
  167.    :param helper:
  168.    :return: None
  169.    """
  170.     helper.log_debug("Looping over checks...")
  171.     for check in checks:
  172.         check_id = check['checkId']
  173.         result = get_check_result(client, check_id)
  174.         if 'timestamp' in result:  # some checks appear not to have a timestamp? ignore if so
  175.             result_timestamp = result['timestamp'].split('T')[0]
  176.             check_timestamp=helper.get_check_point(check_id)
  177.             helper.log_info("check_timestamp={}".format(check_timestamp))
  178.             #2018-09-18T15:21:17Z
  179.             #if newer_timestamp(check_timestamp, result_timestamp):
  180.             if True:
  181.                 generate_events(helper, result, check, ew)
  182.     return
  183.  
  184.  
  185.  
  186.  
  187. def now():
  188.     """
  189.    Current time in UTC
  190.    :return: now_format
  191.    """
  192.     utc_now = datetime.datetime.utcnow()
  193.     now_format = utc_now.strftime('%Y-%m-%dT%H:%M:%SZ')
  194.     return now_format
  195.  
  196.  
  197. def generate_events(helper, result, check, ew):
  198.     """
  199.    Generates events for Splunk
  200.    :param helper
  201.    :param result:
  202.    :param check:
  203.    :return:
  204.    """
  205.  
  206.     event_data = helper.get_input_stanza(input_stanza_name=helper.get_arg('name'))
  207.  
  208.     check_id = check['checkId']
  209.     check_metadata = check['metadata']
  210.     merged = []
  211.     merged_html = []
  212.     ordered_result = OrderedDict()
  213.     if 'timestamp' in result:
  214.         ordered_result['timestamp'] = result['timestamp']
  215.         del result['timestamp']
  216.     else:  # probably overkill -- all checks SHOULD have a timestamp
  217.         now_timestamp = now()
  218.         ordered_result['timestamp'] = now_timestamp
  219.     for key in result:
  220.         if key == 'flaggedResources':
  221.             merged, merged_html = merge_metadata(result[key], check_metadata)
  222.         if merged:
  223.             ordered_result['metadata'] = merged
  224.             ordered_result['metadata_html'] = merged_html
  225.         ordered_result[key] = result[key]
  226.     event = helper.new_event(json.dumps(ordered_result), source=helper.get_arg('name'), index=event_data['index'], host=event_data['host'], sourcetype=event_data['sourcetype'], done=True, unbroken=True)
  227.     ew.write_event(event)
  228.     #helper.log_info(newEventResp)
  229.     #print(json.dumps(ordered_result))
  230.  
  231.     helper.save_check_point(check_id, ordered_result['timestamp'])
  232.  
  233.     return
  234.  
  235.  
  236. def collect_events(helper, ew):
  237.  
  238.     aws_access_key = helper.get_arg('aws_access_key')
  239.     aws_secret_key = helper.get_arg('aws_secret_key')
  240.  
  241.     helper.log_warning(helper.get_input_stanza(input_stanza_name=helper.get_arg('name'))['index'])
  242.  
  243.     helper.log_warning(helper.get_arg('name'))
  244.     #exit(1)
  245.     role_arn = helper.get_arg('role_arn')
  246.     name = helper.get_arg('name')
  247.  
  248.  
  249.     client = authenticate(helper)
  250.     #client = authenticate(aws_access_key, aws_secret_key)
  251.  
  252.     checks = get_trusted_advisor_checks(client)
  253.     helper.log_debug(checks)
  254.     loop_checks(client, checks, helper, ew)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement