diff options
Diffstat (limited to 'bin')
| -rw-r--r-- | bin/ansibleutil.py | 25 | ||||
| -rwxr-xr-x | bin/oscp | 115 | ||||
| -rwxr-xr-x | bin/ossh | 29 | 
3 files changed, 81 insertions, 88 deletions
diff --git a/bin/ansibleutil.py b/bin/ansibleutil.py index f5f699918..07e41b42c 100644 --- a/bin/ansibleutil.py +++ b/bin/ansibleutil.py @@ -5,6 +5,7 @@ import sys  import os  import json  import re +import collections  class AnsibleUtil(object):      def __init__(self): @@ -53,7 +54,7 @@ class AnsibleUtil(object):          return groups -    def build_host_dict(self, args=[]): +    def build_host_dict_by_env(self, args=[]):          inv = self.get_inventory(args)          inst_by_env = {} @@ -63,27 +64,5 @@ class AnsibleUtil(object):              host_id = "%s:%s" % (host['ec2_tag_Name'],host['ec2_id'])              inst_by_env[host['ec2_tag_environment']][host_id] = host -          return inst_by_env - -    def get_hostnames(self, args=[]): -        inv = self.get_inventory(args) - -        import collections -        hostnames = collections.defaultdict(list) - -        for dns, host in inv['_meta']['hostvars'].items(): -            hostnames['ec2_tag_Name'].append(host['ec2_id']) - -        return hostnames - -    def get_host_ids(self, args=[]): -        inv = self.get_inventory(args) - -        ids = {} - -        for dns, host in inv['_meta']['hostvars'].items(): -            ids['ec2_id'] = host - -        return ids @@ -16,12 +16,6 @@ class Oscp(object):          # parse host and user          self.process_host() -        print self.args -        print self.host -        print self.user -        print self.path -        sys.exit(0) -          self.ansible = ansibleutil.AnsibleUtil()          # get a dict of host inventory @@ -30,16 +24,12 @@ class Oscp(object):          else:              self.get_hosts(True) - -        if not self.args.list and not self.env: -            print "Please specify an environment." -            return - -        if self.args.host == '' and not self.args.list: +        if (self.args.src == '' or self.args.dest == '') and not self.args.list:              self.parser.print_help()              return          if self.args.debug: +            print self.host              print self.args          # perform the scp @@ -50,14 +40,16 @@ class Oscp(object):      def parse_cli_args(self):          parser = argparse.ArgumentParser(description='Openshift Online SSH Tool.') +        parser.add_argument('-e', '--env',  +                          action="store", help="Environment where this server exists.")          parser.add_argument('-d', '--debug', default=False,                            action="store_true", help="debug mode")          parser.add_argument('-v', '--verbose', default=False,                            action="store_true", help="Verbose?")          parser.add_argument('--list', default=False,                            action="store_true", help="list out hosts") -        parser.add_argument('-r', action='store_true', default=False, -                            help='Recusrively copy files to or from destination.') +        parser.add_argument('-r', '--recurse', action='store_true', default=False, +                            help='Recursively copy files to or from destination.')          parser.add_argument('-o', '--ssh_opts', action='store',                              help='options to pass to SSH.\n \                                    "-oPort=22,TCPKeepAlive=yes"') @@ -72,26 +64,43 @@ class Oscp(object):      def process_host(self):          '''Determine host name and user name for SSH.          ''' -        self.user = None -        self.path = '' +        self.user = '' -        self.host = '' -        if '@' in self.args.src: +        # is the first param passed a valid file? +        if os.path.isfile(self.args.src) or os.path.isdir(self.args.src): +            self.local_src = True +            self.host = self.args.dest +        else: +            self.local_src = False              self.host = self.args.src + +        if '@' in self.host: +            re_host = re.compile("(.*@)(.*)(:.*$)")          else: -            self.host = self.args.dest +            re_host = re.compile("(.*)(:.*$)") -        re_host = re.compile("(.*)@(.*)(:.*$)")          search = re_host.search(self.host) +          if search: -            # take the first? -            self.user = search.groups()[0] -            self.host = search.groups()[1] -            self.path = search.groups()[2] +            if len(search.groups()) > 2: +                self.user = search.groups()[0] +                self.host = search.groups()[1] +                self.path = search.groups()[2] +            else: +                self.host = search.groups()[0] +                self.path = search.groups()[1]          else:              print "Could not determine user and hostname."              return +        if self.args.env: +            self.env = self.args.env +        elif "." in self.host: +            self.host, self.env = self.host.split(".") +        else: +            print "HERE" +            self.env = None +      def get_hosts(self, cache_only=False):          '''Query our host inventory and return a dict where the format             equals: @@ -99,31 +108,28 @@ class Oscp(object):             dict['environment'] = [{'servername' : {}}, ]          '''          if cache_only: -            self.host_inventory = self.ansible.build_host_dict(['--cache-only']) +            self.host_inventory = self.ansible.build_host_dict_by_env(['--cache-only'])          else: -            self.host_inventory = self.ansible.build_host_dict() +            self.host_inventory = self.ansible.build_host_dict_by_env() -    def select_host(self, regex=False): +    def select_host(self):          '''select host attempts to match the host specified             on the command line with a list of hosts. - -           if regex is specified then we will attempt to match -           all *{host_string}* equivalents.          ''' -        re_host = re.compile(self.host) -          results = [] -        for hostname, server_info in self.host_inventory[self.env].items(): -            if hostname.split(':')[0] == self.host: -                # an exact match, return it! -                return [(hostname, server_info)] -            elif re_host.search(hostname): -                results.append((hostname, server_info)) +        for env in self.host_inventory.keys(): +            for hostname, server_info in self.host_inventory[env].items(): +                if hostname.split(':')[0] == self.host: +                    results.append((hostname, server_info)) + +        # attempt to select the correct environment if specified +        if self.env: +            results = filter(lambda result: result[1]['ec2_tag_environment'] == self.env, results)          if results:              return results          else: -            print "Could not find specified host: %s in %s" % (self.host, self.env) +            print "Could not find specified host: %s." % self.host          # default - no results found.          return None @@ -135,7 +141,7 @@ class Oscp(object):          '''          if self.env: -            results = self.select_host(True) +            results = self.select_host()              if len(results) == 1:                  hostname, server_info = results[0]                  sorted_keys = server_info.keys() @@ -172,27 +178,38 @@ class Oscp(object):              if self.args.verbose:                  scp_args.append('-v') +            if self.args.recurse: +                scp_args.append('-r') +              if self.args.ssh_opts:                  for arg in self.args.ssh_opts.split(","):                      scp_args.append("-o%s" % arg) -            result = self.select_host() -            if not result: +            results = self.select_host() + +            if self.args.debug: print results + +            if not results:                  return # early exit, no results -            if len(result) > 1: -                self.list_hosts(10) +            if len(results) > 1: +                print "Multiple results found for %s." % self.host +                for result in results: +                    print "{ec2_tag_Name:<35} {ec2_tag_environment:<5} {ec2_id:<10}".format(**result[1])                  return # early exit, too many results              # Assume we have one and only one. -            hostname, server_info = result[0] +            hostname, server_info = results[0]              dns = server_info['ec2_public_dns_name'] -            scp_args.append(dns) +            host_str = "%s%s%s" % (self.user, dns, self.path) -            #last argument -            if self.args.command: -                scp_args.append("%s" % self.args.command) +            if self.local_src: +                scp_args.append(self.args.src) +                scp_args.append(host_str) +            else: +                scp_args.append(host_str) +                scp_args.append(self.args.dest)              print "Running: %s\n" % ' '.join(scp_args) @@ -99,31 +99,28 @@ class Ossh(object):             dict['servername'] = dns_name          '''          if cache_only: -            self.host_inventory = self.ansible.build_host_dict(['--cache-only']) +            self.host_inventory = self.ansible.build_host_dict_by_env(['--cache-only'])          else: -            self.host_inventory = self.ansible.build_host_dict() +            self.host_inventory = self.ansible.build_host_dict_by_env() -    def select_host(self, regex=False): +    def select_host(self):          '''select host attempts to match the host specified             on the command line with a list of hosts. - -           if regex is specified then we will attempt to match -           all *{host_string}* equivalents.          ''' -        re_host = re.compile(self.host) -          results = [] -        for hostname, server_info in self.host_inventory[self.env].items(): -            if hostname.split(':')[0] == self.host: -                # an exact match, return it! -                return [(hostname, server_info)] -            elif re_host.search(hostname): -                results.append((hostname, server_info)) +        for env in self.host_inventory.keys(): +            for hostname, server_info in self.host_inventory[env].items(): +                if hostname.split(':')[0] == self.host: +                    results.append((hostname, server_info)) + +        # attempt to select the correct environment if specified +        if self.env: +            results = filter(lambda result: result[1]['ec2_tag_environment'] == self.env, results)          if results:              return results          else: -            print "Could not find specified host: %s in %s" % (self.host, self.env) +            print "Could not find specified host: %s." % self.host          # default - no results found.          return None @@ -135,7 +132,7 @@ class Ossh(object):          '''          if self.env: -            results = self.select_host(True) +            results = self.select_host()              if len(results) == 1:                  hostname, server_info = results[0]                  sorted_keys = server_info.keys()  | 
