123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- #! /usr/bin/python
- #
- # Find an instance within a profile, across all regions
- #
- # Unbuffered, no CRLF print:
- from __future__ import print_function
- import sys, os
- import boto3
- import boto3.session
- import botocore
- import threading # We may not do it yet, but developing with threadsafe in mind, as best I can
- try:
- # Python 3
- import builtins
- except ImportError:
- # Python 2
- import __builtin__ as builtins
- # Debug levels:
- # 1 = Show progress
- # 2 = Informational
- # 3 = Additional error info (includes failed lookups)
- # 5 = Include boto3 logging
- DEBUG=0
- # Fancy print function to make it 3.4 compatible:
- if len(sys.argv) != 3:
- print("Usage: " + os.path.basename(sys.argv[0]) + "<searchstring> <profile>")
- exit(1)
- if DEBUG >= 5:
- boto3.set_stream_logger('botocore', level=DEBUG)
- SEARCHSTRING=sys.argv[1]
- PROFILE=sys.argv[2]
- # Set the profile to use
- try:
- boto3.setup_default_session(profile_name=PROFILE)
- except:
- print("Could not find profile: " + PROFILE)
- exit(2)
- # Connect to ec2
- ec2 = boto3.client('ec2')
- # Grab list of regions
- regions = set()
- for region in ec2.describe_regions()['Regions']:
- regions.add(region['RegionName'])
- # For each array, let's search:
- FOUND=0
- FOUNDSTR=""
- if DEBUG == 1:
- print("Searching.", end="")
- sys.stdout.flush()
- for region in regions:
- if DEBUG == 1:
- print(".", end="")
- sys.stdout.flush()
- if DEBUG >= 2:
- print("Searching region " + region + " in profile " + PROFILE)
- ec2 = boto3.client('ec2', region_name=region)
- try:
- sg = ec2.describe_security_groups(GroupIds=[ SEARCHSTRING ])
- FOUND=FOUND+1
- if DEBUG >= 2:
- print("FOUND in profile '" + PROFILE + "', Region: '" + region + "': ID=" + str(sg['SecurityGroups'][0]['GroupId']))
- if FOUND > 1:
- FOUNDSTR = FOUNDSTR + "\n"
- FOUNDSTR = FOUNDSTR + "FOUND in profile '" + PROFILE + "', Region: '" + region
- continue
- except botocore.exceptions.ClientError as e:
- if DEBUG >= 2:
- print("Not found by ID in profile '" + PROFILE + "', Region: '" + region + "'")
- except:
- if DEBUG >= 3:
- # Print the error
- print(str( sys.exc_info() ))
- try:
- sg = ec2.describe_security_groups(Filters=[ {'Name': 'group-name', 'Values': [ SEARCHSTRING ] } ])
- except:
- if DEBUG >= 3:
- # Print the error
- print(str( sys.exc_info() ))
- try:
- if(sg['SecurityGroups'][0]['GroupId']):
- FOUND=FOUND+1
- if DEBUG >= 2:
- print("FOUND in profile '" + PROFILE + "', Region: '" + region + "': ID=" + str(sg['SecurityGroups'][0]['GroupId']))
- if FOUND > 1:
- FOUNDSTR = FOUNDSTR + "\n"
- FOUNDSTR = FOUNDSTR + "FOUND in profile '" + PROFILE + "', Region: '" + region
- continue
- except IndexError:
- if DEBUG >= 2:
- print("Not found by Name search in profile '" + PROFILE + "', Region: '" + region + "'")
- # End of for region
- if DEBUG == 1:
- print(".")
- sys.stdout.flush()
- if DEBUG >= 2:
- print("Found " + str(FOUND) + " instances.")
- if FOUND > 0:
- print(FOUNDSTR)
- exit(0)
- else:
- if DEBUG == 1:
- print("Not found.")
- exit(255)
|