diff env/lib/python3.7/site-packages/boto/manage/cmdshell.py @ 5:9b1c78e6ba9c draft default tip

"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author shellac
date Mon, 01 Jun 2020 08:59:25 -0400
parents 79f47841a781
children
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/boto/manage/cmdshell.py	Thu May 14 16:47:39 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,407 +0,0 @@
-# Copyright (c) 2006-2009 Mitch Garnaat http://garnaat.org/
-#
-# Permission is hereby granted, free of charge, to any person obtaining a
-# copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish, dis-
-# tribute, sublicense, and/or sell copies of the Software, and to permit
-# persons to whom the Software is furnished to do so, subject to the fol-
-# lowing conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
-# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-# IN THE SOFTWARE.
-"""
-The cmdshell module uses the paramiko package to create SSH connections
-to the servers that are represented by instance objects. The module has
-functions for running commands, managing files, and opening interactive
-shell sessions over those connections.
-"""
-from boto.mashups.interactive import interactive_shell
-import boto
-import os
-import time
-import shutil
-import paramiko
-import socket
-import subprocess
-
-from boto.compat import StringIO
-
-class SSHClient(object):
-    """
-    This class creates a paramiko.SSHClient() object that represents
-    a session with an SSH server. You can use the SSHClient object to send
-    commands to the remote host and manipulate files on the remote host. 
-    
-    :ivar server: A Server object or FakeServer object.
-    :ivar host_key_file: The path to the user's .ssh key files.
-    :ivar uname: The username for the SSH connection. Default = 'root'.
-    :ivar timeout: The optional timeout variable for the TCP connection.
-    :ivar ssh_pwd: An optional password to use for authentication or for
-                    unlocking the private key.
-    """
-    def __init__(self, server,
-                 host_key_file='~/.ssh/known_hosts',
-                 uname='root', timeout=None, ssh_pwd=None):
-        self.server = server
-        self.host_key_file = host_key_file
-        self.uname = uname
-        self._timeout = timeout
-        self._pkey = paramiko.RSAKey.from_private_key_file(server.ssh_key_file,
-                                                           password=ssh_pwd)
-        self._ssh_client = paramiko.SSHClient()
-        self._ssh_client.load_system_host_keys()
-        self._ssh_client.load_host_keys(os.path.expanduser(host_key_file))
-        self._ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
-        self.connect()
-
-    def connect(self, num_retries=5):
-        """
-        Connect to an SSH server and authenticate with it.
-        
-        :type num_retries: int
-        :param num_retries: The maximum number of connection attempts.
-        """
-        retry = 0
-        while retry < num_retries:
-            try:
-                self._ssh_client.connect(self.server.hostname,
-                                         username=self.uname,
-                                         pkey=self._pkey,
-                                         timeout=self._timeout)
-                return
-            except socket.error as xxx_todo_changeme:
-                (value, message) = xxx_todo_changeme.args
-                if value in (51, 61, 111):
-                    print('SSH Connection refused, will retry in 5 seconds')
-                    time.sleep(5)
-                    retry += 1
-                else:
-                    raise
-            except paramiko.BadHostKeyException:
-                print("%s has an entry in ~/.ssh/known_hosts and it doesn't match" % self.server.hostname)
-                print('Edit that file to remove the entry and then hit return to try again')
-                raw_input('Hit Enter when ready')
-                retry += 1
-            except EOFError:
-                print('Unexpected Error from SSH Connection, retry in 5 seconds')
-                time.sleep(5)
-                retry += 1
-        print('Could not establish SSH connection')
-
-    def open_sftp(self):
-        """
-        Open an SFTP session on the SSH server.
-        
-        :rtype: :class:`paramiko.sftp_client.SFTPClient`
-        :return: An SFTP client object.
-        """
-        return self._ssh_client.open_sftp()
-
-    def get_file(self, src, dst):
-        """
-        Open an SFTP session on the remote host, and copy a file from
-        the remote host to the specified path on the local host.
-        
-        :type src: string
-        :param src: The path to the target file on the remote host.
-        
-        :type dst: string
-        :param dst: The path on your local host where you want to
-                    store the file.
-        """
-        sftp_client = self.open_sftp()
-        sftp_client.get(src, dst)
-
-    def put_file(self, src, dst):
-        """
-        Open an SFTP session on the remote host, and copy a file from
-        the local host to the specified path on the remote host.
-        
-        :type src: string
-        :param src: The path to the target file on your local host.
-        
-        :type dst: string
-        :param dst: The path on the remote host where you want to store
-                    the file.
-        """
-        sftp_client = self.open_sftp()
-        sftp_client.put(src, dst)
-
-    def open(self, filename, mode='r', bufsize=-1):
-        """
-        Open an SFTP session to the remote host, and open a file on
-        that host.
-        
-        :type filename: string
-        :param filename: The path to the file on the remote host.
-        
-        :type mode: string
-        :param mode: The file interaction mode.
-        
-        :type bufsize: integer
-        :param bufsize: The file buffer size.
-        
-        :rtype: :class:`paramiko.sftp_file.SFTPFile`
-        :return: A paramiko proxy object for a file on the remote server.
-        """
-        sftp_client = self.open_sftp()
-        return sftp_client.open(filename, mode, bufsize)
-
-    def listdir(self, path):
-        """
-        List all of the files and subdirectories at the specified path
-        on the remote host.
-        
-        :type path: string
-        :param path: The base path from which to obtain the list.
-          
-        :rtype: list
-        :return: A list of files and subdirectories at the specified path.
-        """
-        sftp_client = self.open_sftp()
-        return sftp_client.listdir(path)
-
-    def isdir(self, path):
-        """
-        Check the specified path on the remote host to determine if
-        it is a directory.
-        
-        :type path: string
-        :param path: The path to the directory that you want to check.
-        
-        :rtype: integer
-        :return: If the path is a directory, the function returns 1.
-                If the path is a file or an invalid path, the function
-                returns 0.
-        """
-        status = self.run('[ -d %s ] || echo "FALSE"' % path)
-        if status[1].startswith('FALSE'):
-            return 0
-        return 1
-
-    def exists(self, path):
-        """
-        Check the remote host for the specified path, or a file
-        at the specified path. This function returns 1 if the
-        path or the file exist on the remote host, and returns 0 if
-        the path or the file does not exist on the remote host.
-        
-        :type path: string
-        :param path: The path to the directory or file that you want to check.
-        
-        :rtype: integer
-        :return: If the path or the file exist, the function returns 1.
-                If the path or the file do not exist on the remote host,
-                the function returns 0.
-        """
-        
-        status = self.run('[ -a %s ] || echo "FALSE"' % path)
-        if status[1].startswith('FALSE'):
-            return 0
-        return 1
-
-    def shell(self):
-        """
-        Start an interactive shell session with the remote host.
-        """
-        channel = self._ssh_client.invoke_shell()
-        interactive_shell(channel)
-
-    def run(self, command):
-        """
-        Run a command on the remote host.
-        
-        :type command: string
-        :param command: The command that you want to send to the remote host.
-
-        :rtype: tuple
-        :return: This function returns a tuple that contains an integer status,
-                the stdout from the command, and the stderr from the command.
-
-        """
-        boto.log.debug('running:%s on %s' % (command, self.server.instance_id))
-        status = 0
-        try:
-            t = self._ssh_client.exec_command(command)
-        except paramiko.SSHException:
-            status = 1
-        std_out = t[1].read()
-        std_err = t[2].read()
-        t[0].close()
-        t[1].close()
-        t[2].close()
-        boto.log.debug('stdout: %s' % std_out)
-        boto.log.debug('stderr: %s' % std_err)
-        return (status, std_out, std_err)
-
-    def run_pty(self, command):
-        """
-        Request a pseudo-terminal from a server, and execute a command on that
-        server.
-
-        :type command: string
-        :param command: The command that you want to run on the remote host.
-        
-        :rtype: :class:`paramiko.channel.Channel`
-        :return: An open channel object.
-        """
-        boto.log.debug('running:%s on %s' % (command, self.server.instance_id))
-        channel = self._ssh_client.get_transport().open_session()
-        channel.get_pty()
-        channel.exec_command(command)
-        return channel
-
-    def close(self):
-        """
-        Close an SSH session and any open channels that are tied to it.
-        """
-        transport = self._ssh_client.get_transport()
-        transport.close()
-        self.server.reset_cmdshell()
-
-class LocalClient(object):
-    """
-    :ivar server: A Server object or FakeServer object.
-    :ivar host_key_file: The path to the user's .ssh key files.
-    :ivar uname: The username for the SSH connection. Default = 'root'.
-    """
-    def __init__(self, server, host_key_file=None, uname='root'):
-        self.server = server
-        self.host_key_file = host_key_file
-        self.uname = uname
-
-    def get_file(self, src, dst):
-        """
-        Copy a file from one directory to another.
-        """
-        shutil.copyfile(src, dst)
-
-    def put_file(self, src, dst):
-        """
-        Copy a file from one directory to another.
-        """
-        shutil.copyfile(src, dst)
-
-    def listdir(self, path):
-        """
-        List all of the files and subdirectories at the specified path.
-        
-        :rtype: list
-        :return: Return a list containing the names of the entries
-                in the directory given by path.
-        """
-        return os.listdir(path)
-
-    def isdir(self, path):
-        """
-        Check the specified path to determine if it is a directory.
-        
-        :rtype: boolean
-        :return: Returns True if the path is an existing directory.
-        """
-        return os.path.isdir(path)
-
-    def exists(self, path):
-        """
-        Check for the specified path, or check a file at the specified path.
-        
-        :rtype: boolean
-        :return: If the path or the file exist, the function returns True.
-        """
-        return os.path.exists(path)
-
-    def shell(self):
-        raise NotImplementedError('shell not supported with LocalClient')
-
-    def run(self):
-        """
-        Open a subprocess and run a command on the local host.
-        
-        :rtype: tuple
-        :return: This function returns a tuple that contains an integer status
-                and a string with the combined stdout and stderr output.
-        """
-        boto.log.info('running:%s' % self.command)
-        log_fp = StringIO()
-        process = subprocess.Popen(self.command, shell=True, stdin=subprocess.PIPE,
-                                   stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-        while process.poll() is None:
-            time.sleep(1)
-            t = process.communicate()
-            log_fp.write(t[0])
-            log_fp.write(t[1])
-        boto.log.info(log_fp.getvalue())
-        boto.log.info('output: %s' % log_fp.getvalue())
-        return (process.returncode, log_fp.getvalue())
-
-    def close(self):
-        pass
-
-class FakeServer(object):
-    """
-    This object has a subset of the variables that are normally in a
-    :class:`boto.manage.server.Server` object. You can use this FakeServer
-    object to create a :class:`boto.manage.SSHClient` object if you
-    don't have a real Server object.
-    
-    :ivar instance: A boto Instance object.
-    :ivar ssh_key_file: The path to the SSH key file.
-    """
-    def __init__(self, instance, ssh_key_file):
-        self.instance = instance
-        self.ssh_key_file = ssh_key_file
-        self.hostname = instance.dns_name
-        self.instance_id = self.instance.id
-
-def start(server):
-    """
-    Connect to the specified server.
-
-    :return: If the server is local, the function returns a 
-            :class:`boto.manage.cmdshell.LocalClient` object.
-            If the server is remote, the function returns a
-            :class:`boto.manage.cmdshell.SSHClient` object.
-    """
-    instance_id = boto.config.get('Instance', 'instance-id', None)
-    if instance_id == server.instance_id:
-        return LocalClient(server)
-    else:
-        return SSHClient(server)
-
-def sshclient_from_instance(instance, ssh_key_file,
-                            host_key_file='~/.ssh/known_hosts',
-                            user_name='root', ssh_pwd=None):
-    """
-    Create and return an SSHClient object given an
-    instance object.
-
-    :type instance: :class`boto.ec2.instance.Instance` object
-    :param instance: The instance object.
-
-    :type ssh_key_file: string
-    :param ssh_key_file: A path to the private key file that is 
-                        used to log into the instance.
-
-    :type host_key_file: string
-    :param host_key_file: A path to the known_hosts file used
-                          by the SSH client.
-                          Defaults to ~/.ssh/known_hosts
-    :type user_name: string
-    :param user_name: The username to use when logging into
-                      the instance.  Defaults to root.
-
-    :type ssh_pwd: string
-    :param ssh_pwd: The passphrase, if any, associated with
-                    private key.
-    """
-    s = FakeServer(instance, ssh_key_file)
-    return SSHClient(s, host_key_file, user_name, ssh_pwd)