def ssh(self, vm=None, command=None): # # TODO: fix user name issue, should be stored in db # # VERBOSE(vm) ip = vm['ip_public'] key_name = vm['key_name'] image = vm['metadata']['image'] user = Image.guess_username(image) cm = CmDatabase() keys = cm.find_all_by_name(name=key_name, kind="key") for k in keys: if 'location' in k.keys(): if 'private' in k['location'].keys(): key = k['location']['private'] break cm.close_client() if command is None: command = "" if user is None: location = ip else: location = user + '@' + ip cmd = "ssh " \ "-o StrictHostKeyChecking=no " \ "-o UserKnownHostsFile=/dev/null " \ f"-i {key} {location} {command}" cmd = cmd.strip() # VERBOSE(cmd) if command == "": if platform.lower() == 'win32': class disable_file_system_redirection: _disable = ctypes.windll.kernel32.Wow64DisableWow64FsRedirection _revert = ctypes.windll.kernel32.Wow64RevertWow64FsRedirection def __enter__(self): self.old_value = ctypes.c_long() self.success = self._disable(ctypes.byref(self.old_value)) def __exit__(self, type, value, traceback): if self.success: self._revert(self.old_value) with disable_file_system_redirection(): os.system(cmd) else: os.system(cmd) else: if platform.lower() == 'win32': class disable_file_system_redirection: _disable = ctypes.windll.kernel32.Wow64DisableWow64FsRedirection _revert = ctypes.windll.kernel32.Wow64RevertWow64FsRedirection def __enter__(self): self.old_value = ctypes.c_long() self.success = self._disable(ctypes.byref(self.old_value)) def __exit__(self, type, value, traceback): if self.success: self._revert(self.old_value) with disable_file_system_redirection(): ssh = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) else: ssh = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) result = ssh.stdout.read().decode("utf-8") if not result: error = ssh.stderr.readlines() print("ERROR: %s" % error) else: return result
def ssh(self, vm=None, command=None): def key_selector(keys): ''' This is a helper method for ssh key selection THIS IS JUST A SAFETY MEASURE, PLEASE DON'T MIND IT :param keys: :return: ''' tmp_keys = keys[:] # indices = range(1,len(tmp_keys)+1) for key_idx, key in enumerate(keys): key['idx'] = key_idx + 1 print( Printer.flatwrite( tmp_keys, sort_keys=["idx"], order=['idx', 'KeyName', 'KeyFingerprint'], header=['Index', 'Key Name', "Key Fingerprint"], output="table", humanize=None)) # Console.msg("Please select one of the AWS key indices from the table above: ") picked = 0 while picked < 1 or picked > len(keys): try: picked = int( input( "Please select one of the AWS key indices from the table above: " )) except ValueError: pass return keys[picked - 1] cm = CmDatabase() ip = vm['public_ips'] try: key_name = vm['KeyName'] keys = cm.find_all_by_name(name=key_name, kind="key") for k in keys: if 'location' in k.keys(): if 'private' in k['location'].keys(): key = k['location']['private'] break except (KeyError, IndexError): aws_keys = cm.find(kind='key', cloud='aws') if len(aws_keys) == 0: Console.error( f"Could not find a key for the AWS instance '{vm['name']}'" ) Console.error( f"Use `cms help key` to learn how to add and upload a key for AWS" ) return aws_key = key_selector(aws_keys) for sshkey in cm.find_all_by_name(name=aws_key['KeyName'], kind="key"): if "location" in sshkey.keys(): key = sshkey['location']['private'] break user = "******" # needs to be set on creation. if command is None: command = "" if user is None: location = ip else: location = user + '@' + ip cmd = "ssh " \ "-o StrictHostKeyChecking=no " \ "-o UserKnownHostsFile=/dev/null " \ f"-i {key} {location} {command}" cmd = cmd.strip() print(cmd) # VERBOSE(cmd) if command == "": if platform.lower() == 'win32': class disable_file_system_redirection: _disable = ctypes.windll.kernel32.Wow64DisableWow64FsRedirection _revert = ctypes.windll.kernel32.Wow64RevertWow64FsRedirection def __enter__(self): self.old_value = ctypes.c_long() self.success = self._disable( ctypes.byref(self.old_value)) def __exit__(self, type, value, traceback): if self.success: self._revert(self.old_value) with disable_file_system_redirection(): os.system(cmd) else: os.system(cmd) else: if platform.lower() == 'win32': class disable_file_system_redirection: _disable = ctypes.windll.kernel32.Wow64DisableWow64FsRedirection _revert = ctypes.windll.kernel32.Wow64RevertWow64FsRedirection def __enter__(self): self.old_value = ctypes.c_long() self.success = self._disable( ctypes.byref(self.old_value)) def __exit__(self, type, value, traceback): if self.success: self._revert(self.old_value) with disable_file_system_redirection(): ssh = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) else: ssh = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) result = ssh.stdout.read().decode("utf-8") if not result: error = ssh.stderr.readlines() print("ERROR: %s" % error) else: return result