Exemple #1
0
def main(program, mode):
    """
    Parses system arguments and sets defaults
    Calls `ssh` or `sftp` to SSH into the Instance or transfer files.

    :param program: Client program to be used for SSH/SFTP operations.
    :type program: basestring
    :param mode: Identifies either SSH/SFTP operation.
    :type mode: basestring
    """

    usage = ""
    if mode == "ssh":
        usage="""
            mssh [-t instance_id] [-u profile] [-z availability_zone] [-r region] [supported ssh flags] target [command]

            target                => [user@]instance_id | [user@]hostname
            [supported ssh flags] => [-l login_name] [-p port]
        """
    elif mode == "sftp":
        usage="""
            msftp [-u aws_profile] [-z availability_zone] [supported sftp flags] target
            target                 => [user@]instance_id[:file ...][:dir[/]] | [user@]hostname[:file ...][:dir[/]]
            [supported sftp flags] => [-P port] [-b batchfile]
        """

    parser = argparse.ArgumentParser(usage=usage)
    parser.add_argument('-r', '--region', action='store', help='AWS region', type=str, metavar='')
    parser.add_argument('-z', '--zone', action='store', help='Availability zone', type=str, metavar='')
    parser.add_argument('-u', '--profile', action='store', help='AWS Config Profile', type=str, default=DEFAULT_PROFILE, metavar='')
    parser.add_argument('-t', '--instance_id', action='store', help='EC2 Instance ID. Required if target is hostname', type=str, default=DEFAULT_INSTANCE, metavar='')
    parser.add_argument('-d', '--debug', action="store_true", help='Turn on debug logging')

    args = parser.parse_known_args()

    logger = EC2InstanceConnectLogger(args[0].debug)
    try:
        instance_bundles, flags, program_command = input_parser.parseargs(args, mode)
    except Exception as e:
        print(str(e))
        parser.print_help()
        sys.exit(1)

    #Generate temp key
    cli_key = EC2InstanceConnectKey(logger.get_logger())
    cli_command = EC2InstanceConnectCommand(program, instance_bundles, cli_key.get_priv_key_file(), flags, program_command, logger.get_logger())

    try:
        # TODO: Handling for if the '-i' flag is passed
        cli = EC2InstanceConnectCLI(instance_bundles, cli_key.get_pub_key(), cli_command, logger.get_logger())
        cli.invoke_command()
    except Exception as e:
        print('Failed with:\n' + str(e))
        sys.exit(1)
Exemple #2
0
    def test_username(self):
        args = self.parser.parse_known_args(
            ['-u', self.profile, "myuser@{0}".format(self.instance_id)])

        bundles, flags, command = input_parser.parseargs(args)

        self.assertEqual(bundles, [{
            'username': '******',
            'instance_id': self.instance_id,
            'target': None,
            'zone': None,
            'region': None,
            'profile': self.profile
        }])
        self.assertEqual(flags, '')
        self.assertEqual(command, '')
Exemple #3
0
    def test_basic_target(self):
        args = self.parser.parse_known_args(
            ['-u', self.profile, self.instance_id])

        bundles, flags, command = input_parser.parseargs(args)

        self.assertEqual(bundles, [{
            'username': self.default_user,
            'instance_id': self.instance_id,
            'target': None,
            'zone': None,
            'region': None,
            'profile': self.profile
        }])
        self.assertEqual(flags, '')
        self.assertEqual(command, '')
Exemple #4
0
    def test_flags(self):
        args = self.parser.parse_known_args(
            ['-u', self.profile, "-1", "-l", "login", self.instance_id])

        bundles, flags, command = input_parser.parseargs(args)

        self.assertEqual(bundles, [{
            'username': '******',
            'instance_id': self.instance_id,
            'target': None,
            'zone': None,
            'region': None,
            'profile': self.profile
        }])
        self.assertEqual(flags, '-1 -l login')
        self.assertEqual(command, '')
Exemple #5
0
    def test_dns_name(self):
        args = self.parser.parse_known_args([
            '-u', self.profile, '-t', self.instance_id, '-r', self.region,
            '-z', self.availability_zone, self.dns_name
        ])

        bundles, flags, command = input_parser.parseargs(args)

        self.assertEqual(bundles, [{
            'username': self.default_user,
            'instance_id': self.instance_id,
            'target': self.dns_name,
            'zone': self.availability_zone,
            'region': self.region,
            'profile': self.profile
        }])
        self.assertEqual(flags, '')
        self.assertEqual(command, '')
Exemple #6
0
    def test_sftp(self):
        args = self.parser.parse_known_args([
            '-u', self.profile, "{0}:{1}".format(self.instance_id,
                                                 'first_file'), 'second_file'
        ])

        bundles, flags, command = input_parser.parseargs(args, 'sftp')

        self.assertEqual(bundles, [{
            'username': self.default_user,
            'instance_id': self.instance_id,
            'target': None,
            'zone': None,
            'region': None,
            'profile': self.profile,
            'file': 'first_file'
        }])
        self.assertEqual(flags, '')
        self.assertEqual(command, 'second_file')
Exemple #7
0
def main(program, mode):
    """
    Parses system arguments sets defaults
    Calls `putty or psftp` to SSH or do file operations using EC2InstanceConnect.

    :param program: Client program to be used for SSH/SFTP operations.
    :type program: basestring
    :param mode: Identifies either SSH/SFTP operation.
    :type mode: basestring
    """

    usage = ""
    if mode == "ssh":
        usage = """
            mssh-putty [-t instance_id] [-u profile] [-r region] [-z availability_zone] [-i identity_file_ppk] [supported putty flags] target

            target                  => [user@]instance_id | [user@]dns_name
            [supported putty flags] => [-l login_name] [ -P port] [-m remote_command_file]
        """
    elif mode == "sftp":
        usage = """
            msftp-putty [-t instance_id] [-u profile] [-r region] [-z availability_zone] [-i identity_file_ppk] [supported psftp flags] target

            target                  => [user@]instance_id | [user@]dns_name
            [supported psftp flags] => [-l login_name] [ -P port] [-bc] [-b batchfile]
        """

    parser = argparse.ArgumentParser(usage=usage)
    parser.add_argument('-r',
                        '--region',
                        action='store',
                        help='AWS region',
                        type=str,
                        metavar='')
    parser.add_argument('-z',
                        '--zone',
                        action='store',
                        help='Availability zone',
                        type=str,
                        metavar='')
    parser.add_argument('-i',
                        '--identity',
                        action='store',
                        help="Required. Identity file in ppk format",
                        type=str,
                        required=True,
                        metavar='')
    parser.add_argument('-u',
                        '--profile',
                        action='store',
                        help='AWS Config Profile',
                        type=str,
                        default=DEFAULT_PROFILE,
                        metavar='')
    parser.add_argument(
        '-t',
        '--instance_id',
        action='store',
        help='EC2 Instance ID.  Required if target is hostname',
        type=str,
        default=DEFAULT_INSTANCE,
        metavar='')
    parser.add_argument('-d',
                        '--debug',
                        action="store_true",
                        help='Turn on debug logging')

    args = parser.parse_known_args()

    #Read public key from ppk file.
    #Public key is unencrypted and in rsa format.
    pub_key_lines = []
    pub_key = "ssh-rsa "
    try:
        with open(args[0].identity, 'r') as f:
            pub_key_lines = f.readlines()

        #Validate that the identity file format is ppk.
        if pub_key_lines[0].find("PuTTY-User-Key-File-") == -1:
            print("Not a valid Putty key.")
            sys.exit(1)

        #public key starts from 4th line in ppk file.
        line_len = int(pub_key_lines[3].split(':')[1].strip())
        pub_key_lines = pub_key_lines[4:(4 + line_len)]
        for pub_key_line in pub_key_lines:
            pub_key += pub_key_line[:-1]
    except Exception as e:
        print(str(e))
        sys.exit(1)

    logger = EC2InstanceConnectLogger(args[0].debug)
    try:
        instance_bundles, flags, program_command = input_parser.parseargs(
            args, mode)
    except Exception as e:
        print(str(e))
        parser.print_help()
        sys.exit(1)

    cli_command = EC2InstanceConnectCommand(program, instance_bundles,
                                            args[0].identity,
                                            flags, program_command,
                                            logger.get_logger())
    cli_command.get_command()

    try:
        mssh = EC2InstanceConnectCLI(instance_bundles, pub_key, cli_command,
                                     logger.get_logger())
        mssh.invoke_command()
    except Exception as e:
        print("Failed with:\n" + str(e))
        sys.exit(1)