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.
Files changed (102) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +54 -0
  3. data/bin/console +14 -0
  4. data/bin/ec2-ami-tools-version +6 -0
  5. data/bin/ec2-bundle-image +6 -0
  6. data/bin/ec2-bundle-vol +6 -0
  7. data/bin/ec2-delete-bundle +6 -0
  8. data/bin/ec2-download-bundle +6 -0
  9. data/bin/ec2-migrate-bundle +6 -0
  10. data/bin/ec2-migrate-manifest +6 -0
  11. data/bin/ec2-unbundle +6 -0
  12. data/bin/ec2-upload-bundle +6 -0
  13. data/bin/setup +8 -0
  14. data/etc/ec2/amitools/cert-ec2-cn-north-1.pem +28 -0
  15. data/etc/ec2/amitools/cert-ec2-gov.pem +17 -0
  16. data/etc/ec2/amitools/cert-ec2.pem +23 -0
  17. data/etc/ec2/amitools/mappings.csv +9 -0
  18. data/lib/ec2/amitools/bundle.rb +251 -0
  19. data/lib/ec2/amitools/bundle_base.rb +58 -0
  20. data/lib/ec2/amitools/bundleimage.rb +94 -0
  21. data/lib/ec2/amitools/bundleimageparameters.rb +42 -0
  22. data/lib/ec2/amitools/bundlemachineparameters.rb +60 -0
  23. data/lib/ec2/amitools/bundleparameters.rb +120 -0
  24. data/lib/ec2/amitools/bundlevol.rb +240 -0
  25. data/lib/ec2/amitools/bundlevolparameters.rb +164 -0
  26. data/lib/ec2/amitools/crypto.rb +379 -0
  27. data/lib/ec2/amitools/decryptmanifest.rb +20 -0
  28. data/lib/ec2/amitools/defaults.rb +12 -0
  29. data/lib/ec2/amitools/deletebundle.rb +212 -0
  30. data/lib/ec2/amitools/deletebundleparameters.rb +78 -0
  31. data/lib/ec2/amitools/downloadbundle.rb +161 -0
  32. data/lib/ec2/amitools/downloadbundleparameters.rb +84 -0
  33. data/lib/ec2/amitools/exception.rb +86 -0
  34. data/lib/ec2/amitools/fileutil.rb +219 -0
  35. data/lib/ec2/amitools/format.rb +127 -0
  36. data/lib/ec2/amitools/instance-data.rb +97 -0
  37. data/lib/ec2/amitools/manifest_wrapper.rb +132 -0
  38. data/lib/ec2/amitools/manifestv20070829.rb +361 -0
  39. data/lib/ec2/amitools/manifestv20071010.rb +403 -0
  40. data/lib/ec2/amitools/manifestv3.rb +331 -0
  41. data/lib/ec2/amitools/mapids.rb +148 -0
  42. data/lib/ec2/amitools/migratebundle.rb +222 -0
  43. data/lib/ec2/amitools/migratebundleparameters.rb +173 -0
  44. data/lib/ec2/amitools/migratemanifest.rb +225 -0
  45. data/lib/ec2/amitools/migratemanifestparameters.rb +118 -0
  46. data/lib/ec2/amitools/minimalec2.rb +116 -0
  47. data/lib/ec2/amitools/parameter_exceptions.rb +34 -0
  48. data/lib/ec2/amitools/parameters_base.rb +168 -0
  49. data/lib/ec2/amitools/region.rb +93 -0
  50. data/lib/ec2/amitools/s3toolparameters.rb +183 -0
  51. data/lib/ec2/amitools/showversion.rb +12 -0
  52. data/lib/ec2/amitools/syschecks.rb +27 -0
  53. data/lib/ec2/amitools/tool_base.rb +224 -0
  54. data/lib/ec2/amitools/unbundle.rb +107 -0
  55. data/lib/ec2/amitools/unbundleparameters.rb +65 -0
  56. data/lib/ec2/amitools/uploadbundle.rb +361 -0
  57. data/lib/ec2/amitools/uploadbundleparameters.rb +108 -0
  58. data/lib/ec2/amitools/util.rb +532 -0
  59. data/lib/ec2/amitools/version.rb +33 -0
  60. data/lib/ec2/amitools/xmlbuilder.rb +237 -0
  61. data/lib/ec2/amitools/xmlutil.rb +55 -0
  62. data/lib/ec2/common/constants.rb +16 -0
  63. data/lib/ec2/common/curl.rb +110 -0
  64. data/lib/ec2/common/headers.rb +95 -0
  65. data/lib/ec2/common/headersv4.rb +173 -0
  66. data/lib/ec2/common/http.rb +333 -0
  67. data/lib/ec2/common/s3support.rb +231 -0
  68. data/lib/ec2/common/signature.rb +68 -0
  69. data/lib/ec2/oem/LICENSE.txt +58 -0
  70. data/lib/ec2/oem/open4.rb +399 -0
  71. data/lib/ec2/platform/base/architecture.rb +26 -0
  72. data/lib/ec2/platform/base/constants.rb +54 -0
  73. data/lib/ec2/platform/base/pipeline.rb +181 -0
  74. data/lib/ec2/platform/base.rb +57 -0
  75. data/lib/ec2/platform/current.rb +55 -0
  76. data/lib/ec2/platform/linux/architecture.rb +35 -0
  77. data/lib/ec2/platform/linux/constants.rb +23 -0
  78. data/lib/ec2/platform/linux/fstab.rb +99 -0
  79. data/lib/ec2/platform/linux/identity.rb +16 -0
  80. data/lib/ec2/platform/linux/image.rb +811 -0
  81. data/lib/ec2/platform/linux/mtab.rb +74 -0
  82. data/lib/ec2/platform/linux/pipeline.rb +40 -0
  83. data/lib/ec2/platform/linux/rsync.rb +114 -0
  84. data/lib/ec2/platform/linux/tar.rb +124 -0
  85. data/lib/ec2/platform/linux/uname.rb +50 -0
  86. data/lib/ec2/platform/linux.rb +83 -0
  87. data/lib/ec2/platform/solaris/architecture.rb +28 -0
  88. data/lib/ec2/platform/solaris/constants.rb +30 -0
  89. data/lib/ec2/platform/solaris/fstab.rb +43 -0
  90. data/lib/ec2/platform/solaris/identity.rb +16 -0
  91. data/lib/ec2/platform/solaris/image.rb +327 -0
  92. data/lib/ec2/platform/solaris/mtab.rb +29 -0
  93. data/lib/ec2/platform/solaris/pipeline.rb +40 -0
  94. data/lib/ec2/platform/solaris/rsync.rb +24 -0
  95. data/lib/ec2/platform/solaris/tar.rb +36 -0
  96. data/lib/ec2/platform/solaris/uname.rb +21 -0
  97. data/lib/ec2/platform/solaris.rb +38 -0
  98. data/lib/ec2/platform.rb +69 -0
  99. data/lib/ec2/version.rb +8 -0
  100. data/lib/ec2_amitools +1 -0
  101. data/lib/ec2_amitools.rb +7 -0
  102. metadata +184 -0
@@ -0,0 +1,58 @@
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/amitools/tool_base'
12
+ require 'ec2/amitools/bundleparameters'
13
+
14
+ class BundleTool < AMITool
15
+
16
+ def user_override(name, value)
17
+ if interactive?
18
+ instr = interactive_prompt("Please specify a value for #{name} [#{value}]: ", name)
19
+ return instr.strip unless instr.nil? or instr.strip.empty?
20
+ end
21
+ value
22
+ end
23
+
24
+ def notify(msg)
25
+ $stdout.puts msg
26
+ if interactive?
27
+ print "Hit enter to continue anyway or Control-C to quit."
28
+ gets
29
+ end
30
+ end
31
+
32
+ def get_parameters(params_class)
33
+ params = super(params_class)
34
+
35
+ if params.arch.nil?
36
+ params.arch = SysChecks::get_system_arch()
37
+ raise "missing or bad uname" if params.arch.nil?
38
+ params.arch = user_override("arch", params.arch)
39
+ end
40
+
41
+ unless BundleParameters::SUPPORTED_ARCHITECTURES.include?(params.arch)
42
+ unless warn_confirm("Unsupported architecture [#{params.arch}].")
43
+ raise EC2StopExecution.new()
44
+ end
45
+ end
46
+
47
+ tarcheck = SysChecks::good_tar_version?
48
+ raise "missing or bad tar" if tarcheck.nil?
49
+ unless tarcheck
50
+ unless warn_confirm("Possibly broken tar version found. Please use tar version 1.15 or later.")
51
+ raise EC2StopExecution.new()
52
+ end
53
+ end
54
+
55
+ params
56
+ end
57
+
58
+ end
@@ -0,0 +1,94 @@
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/amitools/bundle'
12
+ require 'ec2/amitools/bundleimageparameters'
13
+ require 'ec2/amitools/bundle_base'
14
+
15
+ MAX_SIZE = 10 * 1024 * 1024 * 1024 # 10 GB in bytes.
16
+ BUNDLE_IMAGE_NAME = 'ec2-bundle-image'
17
+
18
+ # The manual.
19
+ BUNDLE_IMAGE_MANUAL=<<TEXT
20
+ #{BUNDLE_IMAGE_NAME} is a command line tool that creates a bundled Amazon Machine \
21
+ Image (AMI) from a specified loopback filesystem image.
22
+
23
+ #{BUNDLE_IMAGE_NAME} will:
24
+ - tar -S the AMI to preserve sparseness of the image file
25
+ - gzip the result
26
+ - encrypt it
27
+ - split it into parts
28
+ - generate a manifest file describing the bundled AMI
29
+
30
+ #{BUNDLE_IMAGE_NAME} will bundle AMIs of up to 10GB.
31
+ TEXT
32
+
33
+ class ImageBundler < BundleTool
34
+
35
+ def bundle_image(p)
36
+ if p.size_checks
37
+ file_size = File.size(p.image_path)
38
+ if file_size <= 0
39
+ raise "the specified image #{p.image_path} is zero sized"
40
+ elsif file_size > MAX_SIZE
41
+ raise "the specified image #{p.image_path} is too large"
42
+ end
43
+ else
44
+ $stderr.puts 'Warning: disabling size-checks can result in unbootable image'
45
+ end
46
+
47
+ optional_args = {
48
+ :kernel_id => p.kernel_id,
49
+ :ramdisk_id => p.ramdisk_id,
50
+ :product_codes => p.product_codes,
51
+ :ancestor_ami_ids => p.ancestor_ami_ids,
52
+ :block_device_mapping => p.block_device_mapping,
53
+ }
54
+ $stdout.puts 'Bundling image file...'
55
+
56
+ Bundle.bundle_image(File::expand_path(p.image_path),
57
+ p.user,
58
+ p.arch,
59
+ Bundle::ImageType::MACHINE,
60
+ p.destination,
61
+ p.user_pk_path,
62
+ p.user_cert_path,
63
+ p.ec2_cert_path,
64
+ p.prefix,
65
+ optional_args,
66
+ @debug,
67
+ false)
68
+
69
+ $stdout.puts( "#{BUNDLE_IMAGE_NAME} complete." )
70
+ end
71
+
72
+ #------------------------------------------------------------------------------#
73
+ # Overrides
74
+ #------------------------------------------------------------------------------#
75
+
76
+ def get_manual()
77
+ BUNDLE_IMAGE_MANUAL
78
+ end
79
+
80
+ def get_name()
81
+ BUNDLE_IMAGE_NAME
82
+ end
83
+
84
+ def main(p)
85
+ bundle_image(p)
86
+ end
87
+
88
+ end
89
+
90
+ #------------------------------------------------------------------------------#
91
+ # Script entry point. Execute only if this file is being executed.
92
+ if __FILE__ == $0 || $0.match(/bin\/ec2-bundle-image/)
93
+ ImageBundler.new().run(BundleImageParameters)
94
+ end
@@ -0,0 +1,42 @@
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/amitools/bundlemachineparameters'
12
+
13
+ # The Bundle Image command line parameters.
14
+ class BundleImageParameters < BundleMachineParameters
15
+
16
+ IMAGE_PATH_DESCRIPTION = "The path to the file system image to bundle."
17
+ PREFIX_DESCRIPTION = "The filename prefix for bundled AMI files. Defaults to image name."
18
+
19
+ attr_reader :image_path,
20
+ :prefix
21
+
22
+ def mandatory_params()
23
+ super()
24
+ on('-i', '--image PATH', String, IMAGE_PATH_DESCRIPTION) do |path|
25
+ assert_file_exists(path, '--image')
26
+ @image_path = path
27
+ end
28
+ end
29
+
30
+ def optional_params()
31
+ super()
32
+ on('-p', '--prefix PREFIX', String, PREFIX_DESCRIPTION) do |prefix|
33
+ assert_good_key(prefix, '--prefix')
34
+ @prefix = prefix
35
+ end
36
+ end
37
+
38
+ def validate_params()
39
+ raise MissingMandatory.new('--image') unless @image_path
40
+ super()
41
+ end
42
+ end
@@ -0,0 +1,60 @@
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/amitools/bundleparameters'
12
+
13
+ # The Bundle command line parameters.
14
+ class BundleMachineParameters < BundleParameters
15
+
16
+ KERNEL_DESCRIPTION = "Id of the default kernel to launch the AMI with."
17
+ RAMDISK_DESCRIPTION = "Id of the default ramdisk to launch the AMI with."
18
+ ANCESTOR_AMI_IDS_DESCRIPTION = "Lineage of this image. Comma separated list of AMI ids."
19
+ BDM_DESCRIPTION = ['Default block-device-mapping scheme to launch the AMI with. This scheme',
20
+ 'defines how block devices may be exposed to an EC2 instance of this AMI',
21
+ 'if the instance-type of the instance is entitled to the specified device.',
22
+ 'The scheme is a comma-separated list of key=value pairs, where each key',
23
+ 'is a "virtual-name" and each value, the corresponding native device name',
24
+ 'desired. Possible virtual-names are:',
25
+ ' - "ami": denotes the root file system device, as seen by the instance.',
26
+ ' - "root": denotes the root file system device, as seen by the kernel.',
27
+ ' - "swap": denotes the swap device, if present.',
28
+ ' - "ephemeralN": denotes Nth ephemeral store; N is a non-negative integer.',
29
+ 'Note that the contents of the AMI form the root file system. Samples of',
30
+ 'block-device-mappings are:',
31
+ ' - "ami=sda1,root=/dev/sda1,ephemeral0=sda2,swap=sda3"',
32
+ ' - "ami=0,root=/dev/dsk/c0d0s0,ephemeral0=1"'
33
+ ]
34
+
35
+ attr_accessor :kernel_id,
36
+ :ramdisk_id,
37
+ :ancestor_ami_ids,
38
+ :block_device_mapping
39
+
40
+ def optional_params()
41
+ super()
42
+ on( '--kernel ID', KERNEL_DESCRIPTION ) do |id|
43
+ @kernel_id = id
44
+ end
45
+
46
+ on( '--ramdisk ID', RAMDISK_DESCRIPTION ) do |id|
47
+ @ramdisk_id = id
48
+ end
49
+
50
+ on( '-B', '--block-device-mapping MAPS', String, *BDM_DESCRIPTION ) do |bdm|
51
+ @block_device_mapping ||= {}
52
+ raise InvalidValue.new('--block-device-mapping', bdm) if bdm.to_s.empty?
53
+ bdm.split(',').each do |mapping|
54
+ raise InvalidValue.new('--block-device-mapping', bdm) unless mapping =~ /^\s*(\S)+\s*=\s*(\S)+\s*$/
55
+ virtual, device = mapping.split(/=/)
56
+ @block_device_mapping[virtual.strip] = device.strip
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,120 @@
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/amitools/parameters_base'
12
+ require 'timeout'
13
+ require 'ec2/platform/current'
14
+ require 'ec2/amitools/syschecks'
15
+
16
+ # The Bundle command line parameters.
17
+ class BundleParameters < ParametersBase
18
+ include EC2::Platform::Current::Constants
19
+
20
+ SUPPORTED_ARCHITECTURES = ['i386', 'x86_64']
21
+
22
+ USER_DESCRIPTION = "The user's EC2 user ID (Note: AWS account number, NOT Access Key ID)."
23
+ HELP_DESCRIPTION = "Display this help message and exit."
24
+ MANUAL_DESCRIPTION = "Display the user manual and exit."
25
+ DESTINATION_DESCRIPTION = "The directory to create the bundle in. Defaults to '#{Bundling::DESTINATION}'."
26
+ DEBUG_DESCRIPTION = "Display debug messages."
27
+ EC2_CERT_PATH_DESCRIPTION = ['The path to the EC2 X509 public key certificate bundled into the AMI.',
28
+ "Defaults to '#{Bundling::EC2_X509_CERT}'."]
29
+ ARCHITECTURE_DESCRIPTION = "Specify target architecture. One of #{SUPPORTED_ARCHITECTURES.inspect}"
30
+ BATCH_DESCRIPTION = "Run in batch mode. No interactive prompts."
31
+ PRODUCT_CODES_DESCRIPTION = ['Default product codes attached to the image at registration time.',
32
+ 'Comma separated list of product codes.']
33
+ SIZE_CHECKS_DESCRIPTION = 'If set, disables size checks on bundled artifacts.'
34
+ VERSION_DESCRIPTION = "Display the version and copyright notice and then exit."
35
+
36
+ attr_accessor :user_pk_path,
37
+ :user_cert_path,
38
+ :user,
39
+ :destination,
40
+ :ec2_cert_path,
41
+ :debug,
42
+ :show_help,
43
+ :manual,
44
+ :arch,
45
+ :batch_mode,
46
+ :size_checks,
47
+ :product_codes
48
+
49
+ PROMPT_TIMEOUT = 30
50
+
51
+ #----------------------------------------------------------------------------#
52
+
53
+ def mandatory_params()
54
+ on('-c', '--cert PATH', String, USER_CERT_PATH_DESCRIPTION) do |path|
55
+ assert_file_exists(path, '--cert')
56
+ @user_cert_path = path
57
+ end
58
+
59
+ on('-k', '--privatekey PATH', String, USER_PK_PATH_DESCRIPTION) do |path|
60
+ assert_file_exists(path, '--privatekey')
61
+ @user_pk_path = path
62
+ end
63
+
64
+ on('-u', '--user USER', String, USER_ACCOUNT_DESCRIPTION) do |user|
65
+ # Remove hyphens from the Account ID as presented in AWS portal.
66
+ @user = user.gsub("-", "")
67
+ # Validate the account ID looks correct (users often provide us with their akid or secret key)
68
+ unless (@user =~ /\d{12}/)
69
+ raise InvalidValue.new('--user', @user,
70
+ "the user ID should consist of 12 digits (optionally hyphenated); this should not be your Access Key ID")
71
+ end
72
+ end
73
+ end
74
+
75
+ #----------------------------------------------------------------------------#
76
+
77
+ def optional_params()
78
+ on('-d', '--destination PATH', String, DESTINATION_DESCRIPTION) do |path|
79
+ assert_directory_exists(path, '--destination')
80
+ @destination = path
81
+ end
82
+
83
+ on('--ec2cert PATH', String, *BundleParameters::EC2_CERT_PATH_DESCRIPTION) do |path|
84
+ assert_file_exists(path, '--ec2cert')
85
+ @ec2_cert_path = path
86
+ end
87
+
88
+ on('-r', '--arch ARCHITECTURE', String, ARCHITECTURE_DESCRIPTION) do |arch|
89
+ @arch = arch
90
+ end
91
+
92
+ on('--productcodes PRODUCT_CODES', String, *PRODUCT_CODES_DESCRIPTION) do |pc|
93
+ @product_codes = pc
94
+ end
95
+
96
+ on('--no-size-checks', SIZE_CHECKS_DESCRIPTION ) do |o|
97
+ @size_checks = o
98
+ end
99
+ end
100
+
101
+ #----------------------------------------------------------------------------#
102
+
103
+ def validate_params()
104
+ unless @clone_only
105
+ raise MissingMandatory.new('--cert') unless @user_cert_path
106
+ raise MissingMandatory.new('--privatekey') unless @user_pk_path
107
+ raise MissingMandatory.new('--user') unless @user
108
+ end
109
+ end
110
+
111
+ #----------------------------------------------------------------------------#
112
+
113
+ def set_defaults()
114
+ @destination ||= Bundling::DESTINATION
115
+ @ec2_cert_path ||= Bundling::EC2_X509_CERT
116
+ @exclude ||= []
117
+ @size_checks = true
118
+ end
119
+
120
+ end
@@ -0,0 +1,240 @@
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/amitools/bundle'
12
+ require 'ec2/amitools/bundlevolparameters'
13
+ require 'ec2/platform/current'
14
+ require 'ec2/amitools/syschecks'
15
+ require 'ec2/amitools/bundle_base'
16
+
17
+ BUNDLE_VOL_NAME = 'ec2-bundle-vol'
18
+
19
+ BUNDLE_VOL_MANUAL=<<TEXT
20
+ #{BUNDLE_VOL_NAME} is a command line tool that creates an Amazon Machine Image (AMI)
21
+ from an existing Fedora Core installation and bundles it. Its output is a
22
+ bundled AMI consisting of AMI parts and a manifest. Use the '--help'
23
+ option to display help on Bundle Volume parameters.
24
+
25
+ #{BUNDLE_VOL_NAME} can be run from within an installation, provided there is sufficient space
26
+ for the AMI in the destination directory. Note that running Bundle Volume from
27
+ within a running installation may be problematic because partially written files
28
+ may get copied into the AMI. To minimize this risk it is recommended that the
29
+ system is brought down to runlevel 1. Note that this will stop networking, so
30
+ only do this if you have access to the console.
31
+
32
+ If #{BUNDLE_VOL_NAME} is not run from within the installation, the volume belonging to the
33
+ installation must be mounted so that it is accessible to #{BUNDLE_VOL_NAME}.
34
+
35
+ #{BUNDLE_VOL_NAME} will:
36
+ - create a sparse filesystem image
37
+ - recursively copy the specified volume into the image
38
+ - tar -S the image to preserve the sparseness of the image file
39
+ - compress the image
40
+ - encrypt it
41
+ - split it into parts
42
+ - generate a manifest file describing the bundled AMI
43
+
44
+ Recursive Copying
45
+
46
+ The recursive copying process copies directories from the volume into the image.
47
+ The special directories:
48
+
49
+ - '/dev'
50
+ - '/media'
51
+ - '/mnt'
52
+ - '/proc'
53
+ - '/sys'
54
+
55
+ are always excluded.
56
+
57
+ Files matching the following regular expressions:
58
+
59
+ - '*/#*#'
60
+ - '*/.#*'
61
+ - '*.sw'
62
+ - '*.swo'
63
+ - '*.swp'
64
+ - '*~'
65
+ - '*.pem'
66
+ - '*.priv'
67
+ - '*id_rsa*'
68
+ - '*id_dsa*'
69
+ - '*.gpg'
70
+ - '*.jks'
71
+ - '*/.ssh/authorized_keys'
72
+ - '*/.bash_history'
73
+
74
+ are excluded by default on Linux. Individual files that match these patterns may be
75
+ included by specifying the '--include' option.
76
+
77
+ Local directories, which are copied by default, are defined to be those on
78
+ filesystems of the following types:
79
+
80
+ - ext2
81
+ - ext3
82
+ - xfs
83
+ - jfs
84
+ - reiserfs
85
+
86
+ Directories on filesystems that are not of one of the types listed above, such as
87
+ remotely mounted NFS filesystems, are excluded by default, but can be copied
88
+ by using the '--all' option.
89
+
90
+ Symbolic links are preserved by the copying process, provided the link target is
91
+ copied.
92
+
93
+ Mounted File Systems
94
+
95
+ #{BUNDLE_VOL_NAME} will default to bundling the existing /etc/fstab file.
96
+
97
+ #{BUNDLE_VOL_NAME} will create and bundle AMIs of up to 10GB.
98
+
99
+ Note:
100
+ Creating the filesystem on the image may fail in the presence of selinux.
101
+ If you are using selinux, you should disable it before using #{BUNDLE_VOL_NAME}.
102
+ TEXT
103
+
104
+ MAX_SIZE_MB = 10 * 1024 # 10 GB in MB
105
+
106
+ class VolBundler < BundleTool
107
+
108
+ def bundle_vol(p)
109
+ name = p.prefix
110
+ image_file = File::join( p.destination, name )
111
+ volume = File::join( p.volume, "" ) # Add a trailing "/" if not present.
112
+
113
+ #
114
+ # We can't bundle unless we're root.
115
+ #
116
+ raise "You need to be root to run #{$0}" unless SysChecks::root_user?
117
+
118
+ #
119
+ # Extra parameter verification.
120
+ #
121
+ raise "the specified size #{p.size}MB is too large" unless p.size <= MAX_SIZE_MB
122
+ raise "the specified image file #{image_file} already exists" if File::exist?( image_file )
123
+
124
+ #
125
+ # Create a list of files to be included in the image. This list will override any
126
+ # files that are excluded by the security filtered files list. Files are only added if
127
+ # they are under the volume root.
128
+ #
129
+ includes = []
130
+ p.includes.each do |file|
131
+ includes << file
132
+ end
133
+ #
134
+ # Create list of directories to exclude from the image. Always exclude special
135
+ # directories, directories specified by the user and the image file itself.
136
+ #
137
+ exclude = []
138
+ unless p.all
139
+ #
140
+ # Exclude mounted non-local filesystems if they are under the volume root.
141
+ #
142
+ EC2::Platform::Current::Mtab.load.entries.values.each do |entry|
143
+ unless EC2::Platform::Current::LOCAL_FS_TYPES.include? entry.fstype
144
+ exclude << entry.mpoint if entry.mpoint.index(volume) == 0
145
+ end
146
+ end
147
+ end
148
+ EC2::Platform::Current::Image::EXCLUDES.each { |dir| exclude << dir }
149
+
150
+ #
151
+ # Exclude user specified excluded directories if they are under the volume root.
152
+ #
153
+ p.exclude.each do |dir|
154
+ exclude << dir
155
+ end
156
+
157
+ #
158
+ # Exclude the image file if it is under the volume root.
159
+ #
160
+ if image_file.index( volume ) == 0
161
+ exclude << image_file
162
+ end
163
+
164
+ # If we are inheriting instance data but can't access it we want to fail early
165
+ if p.inherit && !EC2::InstanceData.new.instance_data_accessible
166
+ raise EC2FatalError.new(12, "Can't access instance metadata. If you are not bundling on an EC2 instance use --no-inherit.")
167
+ end
168
+
169
+ #
170
+ # Create image from volume.
171
+ #
172
+ image = EC2::Platform::Current::Image.new(volume,
173
+ image_file,
174
+ p.size,
175
+ exclude,
176
+ includes,
177
+ p.filter,
178
+ p.fstab,
179
+ p.part_type,
180
+ p.arch,
181
+ p.script,
182
+ @debug,
183
+ p.grub_config)
184
+ image.make
185
+
186
+ $stdout.puts 'Image file created: %s' % [image_file]
187
+ $stdout.puts 'Volume cloning done.'
188
+ if p.clone_only
189
+ $stdout.puts 'Not bundling image file since "--clone-only" flag was specified.'
190
+ else
191
+ #
192
+ # Bundle the created image file.
193
+ #
194
+ $stdout.puts 'Bundling image file...'
195
+ optional_args = {
196
+ :kernel_id => p.kernel_id,
197
+ :ramdisk_id => p.ramdisk_id,
198
+ :product_codes => p.product_codes,
199
+ :ancestor_ami_ids => p.ancestor_ami_ids,
200
+ :block_device_mapping => p.block_device_mapping
201
+ }
202
+ Bundle.bundle_image(image_file,
203
+ p.user,
204
+ p.arch,
205
+ Bundle::ImageType::VOLUME,
206
+ p.destination,
207
+ p.user_pk_path,
208
+ p.user_cert_path,
209
+ p.ec2_cert_path,
210
+ nil, # prefix
211
+ optional_args,
212
+ @debug,
213
+ p.inherit)
214
+ end
215
+ $stdout.puts("#{BUNDLE_VOL_NAME} complete.")
216
+ end
217
+
218
+ #------------------------------------------------------------------------------#
219
+ # Overrides
220
+ #------------------------------------------------------------------------------#
221
+
222
+ def get_manual()
223
+ BUNDLE_VOL_MANUAL
224
+ end
225
+
226
+ def get_name()
227
+ BUNDLE_VOL_NAME
228
+ end
229
+
230
+ def main(p)
231
+ bundle_vol(p)
232
+ end
233
+
234
+ end
235
+
236
+ #------------------------------------------------------------------------------#
237
+ # Script entry point. Execute only if this file is being executed.
238
+ if __FILE__ == $0 || $0.match(/bin\/ec2-bundle-vol/)
239
+ VolBundler.new().run(BundleVolParameters)
240
+ end