ec2_amitools 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +54 -0
- data/bin/console +14 -0
- data/bin/ec2-ami-tools-version +6 -0
- data/bin/ec2-bundle-image +6 -0
- data/bin/ec2-bundle-vol +6 -0
- data/bin/ec2-delete-bundle +6 -0
- data/bin/ec2-download-bundle +6 -0
- data/bin/ec2-migrate-bundle +6 -0
- data/bin/ec2-migrate-manifest +6 -0
- data/bin/ec2-unbundle +6 -0
- data/bin/ec2-upload-bundle +6 -0
- data/bin/setup +8 -0
- data/etc/ec2/amitools/cert-ec2-cn-north-1.pem +28 -0
- data/etc/ec2/amitools/cert-ec2-gov.pem +17 -0
- data/etc/ec2/amitools/cert-ec2.pem +23 -0
- data/etc/ec2/amitools/mappings.csv +9 -0
- data/lib/ec2/amitools/bundle.rb +251 -0
- data/lib/ec2/amitools/bundle_base.rb +58 -0
- data/lib/ec2/amitools/bundleimage.rb +94 -0
- data/lib/ec2/amitools/bundleimageparameters.rb +42 -0
- data/lib/ec2/amitools/bundlemachineparameters.rb +60 -0
- data/lib/ec2/amitools/bundleparameters.rb +120 -0
- data/lib/ec2/amitools/bundlevol.rb +240 -0
- data/lib/ec2/amitools/bundlevolparameters.rb +164 -0
- data/lib/ec2/amitools/crypto.rb +379 -0
- data/lib/ec2/amitools/decryptmanifest.rb +20 -0
- data/lib/ec2/amitools/defaults.rb +12 -0
- data/lib/ec2/amitools/deletebundle.rb +212 -0
- data/lib/ec2/amitools/deletebundleparameters.rb +78 -0
- data/lib/ec2/amitools/downloadbundle.rb +161 -0
- data/lib/ec2/amitools/downloadbundleparameters.rb +84 -0
- data/lib/ec2/amitools/exception.rb +86 -0
- data/lib/ec2/amitools/fileutil.rb +219 -0
- data/lib/ec2/amitools/format.rb +127 -0
- data/lib/ec2/amitools/instance-data.rb +97 -0
- data/lib/ec2/amitools/manifest_wrapper.rb +132 -0
- data/lib/ec2/amitools/manifestv20070829.rb +361 -0
- data/lib/ec2/amitools/manifestv20071010.rb +403 -0
- data/lib/ec2/amitools/manifestv3.rb +331 -0
- data/lib/ec2/amitools/mapids.rb +148 -0
- data/lib/ec2/amitools/migratebundle.rb +222 -0
- data/lib/ec2/amitools/migratebundleparameters.rb +173 -0
- data/lib/ec2/amitools/migratemanifest.rb +225 -0
- data/lib/ec2/amitools/migratemanifestparameters.rb +118 -0
- data/lib/ec2/amitools/minimalec2.rb +116 -0
- data/lib/ec2/amitools/parameter_exceptions.rb +34 -0
- data/lib/ec2/amitools/parameters_base.rb +168 -0
- data/lib/ec2/amitools/region.rb +93 -0
- data/lib/ec2/amitools/s3toolparameters.rb +183 -0
- data/lib/ec2/amitools/showversion.rb +12 -0
- data/lib/ec2/amitools/syschecks.rb +27 -0
- data/lib/ec2/amitools/tool_base.rb +224 -0
- data/lib/ec2/amitools/unbundle.rb +107 -0
- data/lib/ec2/amitools/unbundleparameters.rb +65 -0
- data/lib/ec2/amitools/uploadbundle.rb +361 -0
- data/lib/ec2/amitools/uploadbundleparameters.rb +108 -0
- data/lib/ec2/amitools/util.rb +532 -0
- data/lib/ec2/amitools/version.rb +33 -0
- data/lib/ec2/amitools/xmlbuilder.rb +237 -0
- data/lib/ec2/amitools/xmlutil.rb +55 -0
- data/lib/ec2/common/constants.rb +16 -0
- data/lib/ec2/common/curl.rb +110 -0
- data/lib/ec2/common/headers.rb +95 -0
- data/lib/ec2/common/headersv4.rb +173 -0
- data/lib/ec2/common/http.rb +333 -0
- data/lib/ec2/common/s3support.rb +231 -0
- data/lib/ec2/common/signature.rb +68 -0
- data/lib/ec2/oem/LICENSE.txt +58 -0
- data/lib/ec2/oem/open4.rb +399 -0
- data/lib/ec2/platform/base/architecture.rb +26 -0
- data/lib/ec2/platform/base/constants.rb +54 -0
- data/lib/ec2/platform/base/pipeline.rb +181 -0
- data/lib/ec2/platform/base.rb +57 -0
- data/lib/ec2/platform/current.rb +55 -0
- data/lib/ec2/platform/linux/architecture.rb +35 -0
- data/lib/ec2/platform/linux/constants.rb +23 -0
- data/lib/ec2/platform/linux/fstab.rb +99 -0
- data/lib/ec2/platform/linux/identity.rb +16 -0
- data/lib/ec2/platform/linux/image.rb +811 -0
- data/lib/ec2/platform/linux/mtab.rb +74 -0
- data/lib/ec2/platform/linux/pipeline.rb +40 -0
- data/lib/ec2/platform/linux/rsync.rb +114 -0
- data/lib/ec2/platform/linux/tar.rb +124 -0
- data/lib/ec2/platform/linux/uname.rb +50 -0
- data/lib/ec2/platform/linux.rb +83 -0
- data/lib/ec2/platform/solaris/architecture.rb +28 -0
- data/lib/ec2/platform/solaris/constants.rb +30 -0
- data/lib/ec2/platform/solaris/fstab.rb +43 -0
- data/lib/ec2/platform/solaris/identity.rb +16 -0
- data/lib/ec2/platform/solaris/image.rb +327 -0
- data/lib/ec2/platform/solaris/mtab.rb +29 -0
- data/lib/ec2/platform/solaris/pipeline.rb +40 -0
- data/lib/ec2/platform/solaris/rsync.rb +24 -0
- data/lib/ec2/platform/solaris/tar.rb +36 -0
- data/lib/ec2/platform/solaris/uname.rb +21 -0
- data/lib/ec2/platform/solaris.rb +38 -0
- data/lib/ec2/platform.rb +69 -0
- data/lib/ec2/version.rb +8 -0
- data/lib/ec2_amitools +1 -0
- data/lib/ec2_amitools.rb +7 -0
- metadata +184 -0
@@ -0,0 +1,34 @@
|
|
1
|
+
# Copyright 2008-2014 Amazon.com, Inc. or its affiliates. All Rights
|
2
|
+
# Reserved. Licensed under the Amazon Software License (the
|
3
|
+
# "License"). You may not use this file except in compliance with the
|
4
|
+
# License. A copy of the License is located at
|
5
|
+
# http://aws.amazon.com/asl or in the "license" file accompanying this
|
6
|
+
# file. This file is distributed on an "AS IS" BASIS, WITHOUT
|
7
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See
|
8
|
+
# the License for the specific language governing permissions and
|
9
|
+
# limitations under the License.
|
10
|
+
|
11
|
+
module ParameterExceptions
|
12
|
+
class Error < RuntimeError
|
13
|
+
end
|
14
|
+
|
15
|
+
class MissingMandatory < Error
|
16
|
+
def initialize(name)
|
17
|
+
super("missing mandatory parameter: #{name}")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class InvalidCombination < Error
|
22
|
+
def initialize(name1, name2)
|
23
|
+
super("#{name1} and #{name2} may not both be provided")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class InvalidValue < Error
|
28
|
+
def initialize(name, value, msg=nil)
|
29
|
+
message = "#{name} has invalid value '#{value.to_s}'"
|
30
|
+
message += ": #{msg}" unless msg.nil?
|
31
|
+
super(message)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,168 @@
|
|
1
|
+
# Copyright 2008-2014 Amazon.com, Inc. or its affiliates. All Rights
|
2
|
+
# Reserved. Licensed under the Amazon Software License (the
|
3
|
+
# "License"). You may not use this file except in compliance with the
|
4
|
+
# License. A copy of the License is located at
|
5
|
+
# http://aws.amazon.com/asl or in the "license" file accompanying this
|
6
|
+
# file. This file is distributed on an "AS IS" BASIS, WITHOUT
|
7
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See
|
8
|
+
# the License for the specific language governing permissions and
|
9
|
+
# limitations under the License.
|
10
|
+
|
11
|
+
require 'optparse'
|
12
|
+
require 'ec2/amitools/parameter_exceptions'
|
13
|
+
require 'ec2/amitools/version'
|
14
|
+
require 'ec2/common/s3support'
|
15
|
+
|
16
|
+
class ParametersBase < OptionParser
|
17
|
+
include ParameterExceptions
|
18
|
+
|
19
|
+
# Descriptions for common parameters:
|
20
|
+
USER_CERT_PATH_DESCRIPTION = "The path to the user's PEM encoded RSA public key certificate file."
|
21
|
+
USER_PK_PATH_DESCRIPTION = "The path to the user's PEM encoded RSA private key file."
|
22
|
+
USER_DESCRIPTION = "The user's AWS access key ID."
|
23
|
+
PASS_DESCRIPTION = "The user's AWS secret access key."
|
24
|
+
USER_ACCOUNT_DESCRIPTION = "The user's EC2 user ID (Note: AWS account number, NOT Access Key ID)."
|
25
|
+
HELP_DESCRIPTION = "Display this help message and exit."
|
26
|
+
MANUAL_DESCRIPTION = "Display the user manual and exit."
|
27
|
+
DEBUG_DESCRIPTION = "Display debug messages."
|
28
|
+
VERSION_DESCRIPTION = "Display the version and copyright notice and then exit."
|
29
|
+
BATCH_DESCRIPTION = "Run in batch mode. No interactive prompts."
|
30
|
+
|
31
|
+
attr_accessor(:show_help,
|
32
|
+
:manual,
|
33
|
+
:version,
|
34
|
+
:batch_mode,
|
35
|
+
:debug)
|
36
|
+
|
37
|
+
#------------------------------------------------------------------------------#
|
38
|
+
# Methods to override in subclasses
|
39
|
+
#------------------------------------------------------------------------------#
|
40
|
+
|
41
|
+
def mandatory_params()
|
42
|
+
# Override this for mandatory parameters
|
43
|
+
end
|
44
|
+
|
45
|
+
def optional_params()
|
46
|
+
# Override this for optional parameters
|
47
|
+
end
|
48
|
+
|
49
|
+
def validate_params()
|
50
|
+
# Override this for parameter validation
|
51
|
+
end
|
52
|
+
|
53
|
+
def set_defaults()
|
54
|
+
# Override this for parameter validation
|
55
|
+
end
|
56
|
+
|
57
|
+
#------------------------------------------------------------------------------#
|
58
|
+
# Useful utility methods
|
59
|
+
#------------------------------------------------------------------------------#
|
60
|
+
|
61
|
+
def early_exit?()
|
62
|
+
@show_help or @manual or @version
|
63
|
+
end
|
64
|
+
|
65
|
+
def interactive?()
|
66
|
+
not (early_exit? or @batch_mode)
|
67
|
+
end
|
68
|
+
|
69
|
+
def version_copyright_string()
|
70
|
+
EC2Version::version_copyright_string()
|
71
|
+
end
|
72
|
+
|
73
|
+
#------------------------------------------------------------------------------#
|
74
|
+
# Validation utility methods
|
75
|
+
#------------------------------------------------------------------------------#
|
76
|
+
|
77
|
+
def assert_exists(path, param)
|
78
|
+
unless File::exist?(path)
|
79
|
+
raise InvalidValue.new(param, path, "File or directory does not exist.")
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def assert_glob_expands(path, param)
|
84
|
+
if Dir::glob(path).empty?
|
85
|
+
raise InvalidValue.new(param, path, "File or directory does not exist.")
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def assert_file_exists(path, param)
|
90
|
+
unless (File::exist?(path) and File::file?(path))
|
91
|
+
raise InvalidValue.new(param, path, "File does not exist or is not a file.")
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def assert_file_executable(path, param)
|
96
|
+
unless (File::executable?(path) and File::file?(path))
|
97
|
+
raise InvalidValue.new(param, path, "File not executable.")
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def assert_directory_exists(path, param)
|
102
|
+
unless (File::exist?(path) and File::directory?(path))
|
103
|
+
raise InvalidValue.new(param, path, "Directory does not exist or is not a directory.")
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def assert_option_in(option, choices, param)
|
108
|
+
unless choices.include?(option)
|
109
|
+
raise InvalidValue.new(param, option)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def assert_good_key(key, param)
|
114
|
+
if key.include?("/")
|
115
|
+
raise InvalidValue.new(param, key, "'/' character not allowed.")
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
#------------------------------------------------------------------------------#
|
120
|
+
# Parameters common to all tools
|
121
|
+
#------------------------------------------------------------------------------#
|
122
|
+
|
123
|
+
def common_params()
|
124
|
+
on('-h', '--help', HELP_DESCRIPTION) do
|
125
|
+
@show_help = true
|
126
|
+
end
|
127
|
+
|
128
|
+
on('--version', VERSION_DESCRIPTION) do
|
129
|
+
@version = true
|
130
|
+
end
|
131
|
+
|
132
|
+
on('--manual', MANUAL_DESCRIPTION) do
|
133
|
+
@manual = true
|
134
|
+
end
|
135
|
+
|
136
|
+
on('--batch', BATCH_DESCRIPTION) do
|
137
|
+
@batch_mode = true
|
138
|
+
end
|
139
|
+
|
140
|
+
on('--debug', DEBUG_DESCRIPTION) do
|
141
|
+
@debug = true
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
|
146
|
+
def initialize(argv, name=nil)
|
147
|
+
super(argv)
|
148
|
+
|
149
|
+
# Mandatory parameters.
|
150
|
+
separator("")
|
151
|
+
separator("MANDATORY PARAMETERS")
|
152
|
+
mandatory_params()
|
153
|
+
|
154
|
+
# Optional parameters.
|
155
|
+
separator("")
|
156
|
+
separator("OPTIONAL PARAMETERS")
|
157
|
+
common_params()
|
158
|
+
optional_params()
|
159
|
+
|
160
|
+
# Parse the command line parameters.
|
161
|
+
parse!(argv)
|
162
|
+
|
163
|
+
unless early_exit?
|
164
|
+
validate_params()
|
165
|
+
set_defaults()
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# Copyright 2008-2014 Amazon.com, Inc. or its affiliates. All Rights
|
2
|
+
# Reserved. Licensed under the Amazon Software License (the
|
3
|
+
# "License"). You may not use this file except in compliance with the
|
4
|
+
# License. A copy of the License is located at
|
5
|
+
# http://aws.amazon.com/asl or in the "license" file accompanying this
|
6
|
+
# file. This file is distributed on an "AS IS" BASIS, WITHOUT
|
7
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See
|
8
|
+
# the License for the specific language governing permissions and
|
9
|
+
# limitations under the License.
|
10
|
+
|
11
|
+
# Module to hold region informations
|
12
|
+
#
|
13
|
+
|
14
|
+
module AwsRegion
|
15
|
+
|
16
|
+
AWS_REGIONS = [
|
17
|
+
'eu-west-1',
|
18
|
+
'eu-central-1',
|
19
|
+
'us-east-1',
|
20
|
+
'us-gov-west-1',
|
21
|
+
'cn-north-1',
|
22
|
+
'us-west-1',
|
23
|
+
'us-west-2',
|
24
|
+
'ap-southeast-1',
|
25
|
+
'ap-southeast-2',
|
26
|
+
'ap-northeast-1',
|
27
|
+
'sa-east-1',
|
28
|
+
]
|
29
|
+
|
30
|
+
S3_LOCATIONS = [
|
31
|
+
'EU', 'eu-west-1',
|
32
|
+
'eu-central-1',
|
33
|
+
'US',
|
34
|
+
'us-gov-west-1',
|
35
|
+
'cn-north-1',
|
36
|
+
'us-west-1',
|
37
|
+
'us-west-2',
|
38
|
+
'ap-southeast-1',
|
39
|
+
'ap-southeast-2',
|
40
|
+
'ap-northeast-1',
|
41
|
+
'sa-east-1',
|
42
|
+
]
|
43
|
+
|
44
|
+
module_function
|
45
|
+
|
46
|
+
def determine_region_from_host host
|
47
|
+
# http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
|
48
|
+
if host == "s3.amazonaws.com" || host == "s3-external-1.amazonaws.com"
|
49
|
+
"us-east-1"
|
50
|
+
elsif
|
51
|
+
domains = host.split(".")
|
52
|
+
# handle s3-$REGION.amazonaws.something
|
53
|
+
if domains.length >= 3 && domains[0].start_with?("s3-")
|
54
|
+
domains[0].sub("s3-", "")
|
55
|
+
# handle s3.$REGION.amazonaws.something, this is specific to the cn-north-1 endpoint
|
56
|
+
elsif domains.length >= 3 && domains[0] == "s3"
|
57
|
+
domains[1]
|
58
|
+
else
|
59
|
+
"us-east-1"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def guess_region_from_s3_bucket(location)
|
65
|
+
if (location == "EU")
|
66
|
+
return "eu-west-1"
|
67
|
+
elsif ((location == "US") || (location == "") || (location.nil?))
|
68
|
+
return "us-east-1"
|
69
|
+
else
|
70
|
+
return location
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def get_s3_location(region)
|
75
|
+
if (region == "eu-west-1")
|
76
|
+
return 'EU'
|
77
|
+
elsif (region == "us-east-1")
|
78
|
+
return :unconstrained
|
79
|
+
else
|
80
|
+
return region
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def regions
|
85
|
+
AWS_REGIONS
|
86
|
+
end
|
87
|
+
|
88
|
+
def s3_locations
|
89
|
+
S3_LOCATIONS
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
@@ -0,0 +1,183 @@
|
|
1
|
+
# Copyright 2008-2014 Amazon.com, Inc. or its affiliates. All Rights
|
2
|
+
# Reserved. Licensed under the Amazon Software License (the
|
3
|
+
# "License"). You may not use this file except in compliance with the
|
4
|
+
# License. A copy of the License is located at
|
5
|
+
# http://aws.amazon.com/asl or in the "license" file accompanying this
|
6
|
+
# file. This file is distributed on an "AS IS" BASIS, WITHOUT
|
7
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See
|
8
|
+
# the License for the specific language governing permissions and
|
9
|
+
# limitations under the License.
|
10
|
+
|
11
|
+
require 'ec2/common/constants'
|
12
|
+
require 'ec2/amitools/parameters_base'
|
13
|
+
require 'ec2/amitools/region'
|
14
|
+
|
15
|
+
#------------------------------------------------------------------------------#
|
16
|
+
|
17
|
+
class S3ToolParameters < ParametersBase
|
18
|
+
|
19
|
+
BUCKET_DESCRIPTION = ["The bucket to use. This is an S3 bucket,",
|
20
|
+
"followed by an optional S3 key prefix using '/' as a delimiter."]
|
21
|
+
MANIFEST_DESCRIPTION = "The path to the manifest file."
|
22
|
+
DELEGATION_TOKEN_DESCRIPTION = "The delegation token pass along to the AWS request."
|
23
|
+
URL_DESCRIPTION = "The S3 service URL. Defaults to https://s3.amazonaws.com."
|
24
|
+
REGION_DESCRIPTION = "The S3 region. Defaults to us-east-1."
|
25
|
+
SIGV2_DESCRIPTION = "Use old signature version 2 signing"
|
26
|
+
PROFILE_PATH = '/latest/meta-data/iam/security-credentials/'
|
27
|
+
PROFILE_HOST = '169.254.169.254'
|
28
|
+
|
29
|
+
REGION_MAP = {
|
30
|
+
'us-east-1' => 'https://s3.amazonaws.com',
|
31
|
+
'us-west-2' => 'https://s3-us-west-2.amazonaws.com',
|
32
|
+
'us-west-1' => 'https://s3-us-west-1.amazonaws.com',
|
33
|
+
'eu-west-1' => 'https://s3-eu-west-1.amazonaws.com',
|
34
|
+
'eu-central-1' => 'https://s3.eu-central-1.amazonaws.com',
|
35
|
+
'ap-southeast-1' => 'https://s3-ap-southeast-1.amazonaws.com',
|
36
|
+
'ap-southeast-2' => 'https://s3-ap-southeast-2.amazonaws.com',
|
37
|
+
'ap-northeast-1' => 'https://s3-ap-northeast-1.amazonaws.com',
|
38
|
+
'sa-east-1' => 'https://s3-sa-east-1.amazonaws.com',
|
39
|
+
'cn-north-1' => 'https://s3.cn-north-1.amazonaws.com.cn',
|
40
|
+
'us-gov-west-1' => 'https://s3-us-gov-west-1.amazonaws.com'
|
41
|
+
}
|
42
|
+
|
43
|
+
VALID_SIGV = ['2', '4']
|
44
|
+
|
45
|
+
DEFAULT_URL = 'https://s3.amazonaws.com'
|
46
|
+
DEFAULT_REGION = 'us-east-1'
|
47
|
+
|
48
|
+
|
49
|
+
attr_accessor :bucket,
|
50
|
+
:keyprefix,
|
51
|
+
:user, # This now contains all the creds.
|
52
|
+
:pass, # pass is just kept for backwards compatibility.
|
53
|
+
:url,
|
54
|
+
:region,
|
55
|
+
:sigv
|
56
|
+
|
57
|
+
#------------------------------------------------------------------------------#
|
58
|
+
|
59
|
+
def split_container(container)
|
60
|
+
splitbits = container.sub(%r{^/*},'').sub(%r{/*$},'').split("/")
|
61
|
+
bucket = splitbits.shift
|
62
|
+
keyprefix = splitbits.join("/")
|
63
|
+
keyprefix += "/" unless keyprefix.empty?
|
64
|
+
@keyprefix = keyprefix
|
65
|
+
@bucket = bucket
|
66
|
+
end
|
67
|
+
|
68
|
+
#----------------------------------------------------------------------------#
|
69
|
+
|
70
|
+
def mandatory_params()
|
71
|
+
on('-b', '--bucket BUCKET', String, *BUCKET_DESCRIPTION) do |container|
|
72
|
+
@container = container
|
73
|
+
split_container(@container)
|
74
|
+
end
|
75
|
+
|
76
|
+
on('-a', '--access-key USER', String, USER_DESCRIPTION) do |user|
|
77
|
+
@user = {} if @user.nil?
|
78
|
+
@user['aws_access_key_id'] = user
|
79
|
+
end
|
80
|
+
|
81
|
+
on('-s', '--secret-key PASSWORD', String, PASS_DESCRIPTION) do |pass|
|
82
|
+
@user = {} if @user.nil?
|
83
|
+
@user['aws_secret_access_key'] = pass
|
84
|
+
@pass = pass
|
85
|
+
end
|
86
|
+
|
87
|
+
on('-t', '--delegation-token TOKEN', String, DELEGATION_TOKEN_DESCRIPTION) do |token|
|
88
|
+
@user = {} if @user.nil?
|
89
|
+
@user['aws_delegation_token'] = token
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
#----------------------------------------------------------------------------#
|
94
|
+
|
95
|
+
def optional_params()
|
96
|
+
on('--url URL', String, URL_DESCRIPTION) do |url|
|
97
|
+
@url = url
|
98
|
+
end
|
99
|
+
|
100
|
+
on('--region REGION', REGION_DESCRIPTION) do |region|
|
101
|
+
@region = region
|
102
|
+
end
|
103
|
+
|
104
|
+
on('--sigv VERSION', SIGV2_DESCRIPTION) do |version_number|
|
105
|
+
@sigv = version_number
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
#----------------------------------------------------------------------------#
|
110
|
+
|
111
|
+
def get_creds_from_instance_profile
|
112
|
+
end
|
113
|
+
|
114
|
+
def get_creds_from_instance_profile
|
115
|
+
begin
|
116
|
+
require 'json'
|
117
|
+
require 'net/http'
|
118
|
+
profile_name = Net::HTTP.get(PROFILE_HOST, PROFILE_PATH)
|
119
|
+
unless (profile_name.nil? || profile_name.strip.empty?)
|
120
|
+
creds_blob = Net::HTTP.get(PROFILE_HOST, PROFILE_PATH + profile_name.strip)
|
121
|
+
creds = JSON.parse(creds_blob)
|
122
|
+
@user = {
|
123
|
+
'aws_access_key_id' => creds['AccessKeyId'],
|
124
|
+
'aws_secret_access_key' => creds['SecretAccessKey'],
|
125
|
+
'aws_delegation_token' => creds['Token'],
|
126
|
+
}
|
127
|
+
@pass = creds['SecretAccessKey']
|
128
|
+
end
|
129
|
+
rescue Exception => e
|
130
|
+
@user = nil
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def validate_params()
|
135
|
+
unless @user
|
136
|
+
get_creds_from_instance_profile
|
137
|
+
end
|
138
|
+
raise MissingMandatory.new('--access-key') unless @user && @user['aws_access_key_id']
|
139
|
+
raise MissingMandatory.new('--secret-key') unless @pass
|
140
|
+
raise MissingMandatory.new('--bucket') unless @container
|
141
|
+
if @sigv && !VALID_SIGV.include?(@sigv)
|
142
|
+
raise InvalidValue.new('--sigv', @sigv, "Please specify one of these values: #{VALID_SIGV.join(', ')}")
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
#----------------------------------------------------------------------------#
|
147
|
+
|
148
|
+
def set_defaults()
|
149
|
+
# We need three values to be set after this point:
|
150
|
+
# region - which will specify the region of the endpoint used for sigv4
|
151
|
+
# url - the url of the endpoint
|
152
|
+
# location - the S3 bucket location
|
153
|
+
#
|
154
|
+
# We allow the user to override any of these values. The client only has
|
155
|
+
# to specify the region value.
|
156
|
+
if @region
|
157
|
+
@url ||= REGION_MAP[@region]
|
158
|
+
elsif @location
|
159
|
+
@region = case @location
|
160
|
+
when "EU" then "eu-west-1"
|
161
|
+
when "US", :unconstrained then "us-east-1"
|
162
|
+
else @location
|
163
|
+
end
|
164
|
+
@url ||= REGION_MAP[@region]
|
165
|
+
elsif @url
|
166
|
+
STDERR.puts "Specifying url has been deprecated, please use only --region"
|
167
|
+
uri = URI.parse(@url)
|
168
|
+
if @region.nil?
|
169
|
+
begin
|
170
|
+
@region = AwsRegion::determine_region_from_host uri.host
|
171
|
+
STDERR.puts "Region determined to be #{@region}"
|
172
|
+
rescue => e
|
173
|
+
STDERR.puts "No region specified and could not determine region from given url"
|
174
|
+
@region = nil
|
175
|
+
end
|
176
|
+
end
|
177
|
+
else
|
178
|
+
@url ||= DEFAULT_URL
|
179
|
+
@region ||= DEFAULT_REGION
|
180
|
+
end
|
181
|
+
@sigv ||= EC2::Common::SIGV4
|
182
|
+
end
|
183
|
+
end
|