Example #1
0
 def execute(self, *args):
     self.valid_args(args)
     self.flags = self.extract_flags(args)
     self.nova = NovaWrapper() if self.needs_auth else None
     if 'force' in self.flags or self.safety_check(*args):
         self.run(*args)
     else:
         print red("Cancelled.")
Example #2
0
class AbstractCommand(object):
    min_args = 0
    needs_auth = True

    def __init__(self, **kwargs):
        self.extra_flags = kwargs
        return super(AbstractCommand, self).__init__()

    def execute(self, *args):
        self.valid_args(args)
        self.flags = self.extract_flags(args)
        self.nova = NovaWrapper() if self.needs_auth else None
        if 'force' in self.flags or self.safety_check(*args):
            self.run(*args)
        else:
            print red("Cancelled.")

    def valid_args(self, args):
        if len(args) < self.min_args:
            msg = red("Too few arguments. {} Required.".format(self.min_args))
            raise InvalidCommandArgs(msg)

    def safety_check(self, *args):
        """Override this method in inherting class."""
        return True

    def run(self, *args):
        """Override this method in inherting class."""
        pass

    def extract_flags(self, args):
        flags = {}
        for arg in args:
            if re.match("--.*?", arg):
                try:
                    index = arg.index('=')
                except ValueError:
                    flags[arg.strip('-')] = True
                else:
                    flags[arg[:index].strip('-')] = arg[index+1:]
        flags.update(self.extra_flags)
        return flags

    def ssh_connect(self, server):
        user = self.flags.get('user')
        host = self.nova.floating_ip(server)
        try:
            port = int(self.flags.get('port', 22))
        except ValueError:
            port = 22
        print "Connecting to {}@{} -p {}".format(user, host, port)
        conn = ssh.Connection(host, username=user, port=port)
        return conn

    def remote_command(self, cmds, *args):
        if not isinstance(cmds, list):
            cmds = [cmds]
        target = args[0]
        server = self.nova.server(target)
        conn = self.ssh_connect(server)
        pword = self.flags.get('sudopass') or getpass("Enter sudo password: "******"Executing: {}".format(cmd)
            cmd = "echo {} | sudo -S {}".format(pword, cmd)
            conn.execute(cmd)