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.")
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)