imagemaster3000 0.1.0

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 (60) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +38 -0
  5. data/.travis.yml +22 -0
  6. data/CODE_OF_CONDUCT.md +74 -0
  7. data/Gemfile +4 -0
  8. data/LICENSE.txt +13 -0
  9. data/README.md +60 -0
  10. data/Rakefile +17 -0
  11. data/bin/imagemaster3000 +4 -0
  12. data/config/definitions/centos-7.json +29 -0
  13. data/config/definitions/debian-8.json +33 -0
  14. data/config/definitions/files/.gitkeep +0 -0
  15. data/config/definitions/files/centos-cloud.cfg +95 -0
  16. data/config/definitions/files/debian-cloud.cfg +101 -0
  17. data/config/definitions/files/serial-getty@ttyS0.service +35 -0
  18. data/config/definitions/files/ttyS0.conf +22 -0
  19. data/config/definitions/files/ubuntu-cloud.cfg +111 -0
  20. data/config/definitions/ubuntu-14.04.json +30 -0
  21. data/config/definitions/ubuntu-16.04.json +30 -0
  22. data/config/imagemaster3000.yml +15 -0
  23. data/imagemaster3000.gemspec +42 -0
  24. data/lib/imagemaster3000/actions/copy.rb +45 -0
  25. data/lib/imagemaster3000/actions/remove.rb +24 -0
  26. data/lib/imagemaster3000/actions.rb +6 -0
  27. data/lib/imagemaster3000/cli.rb +115 -0
  28. data/lib/imagemaster3000/definitions/parser.rb +45 -0
  29. data/lib/imagemaster3000/definitions/schemas/imagemaster3000-definition-schema.json +238 -0
  30. data/lib/imagemaster3000/definitions.rb +5 -0
  31. data/lib/imagemaster3000/entities/downloadable.rb +47 -0
  32. data/lib/imagemaster3000/entities/image.rb +92 -0
  33. data/lib/imagemaster3000/entities.rb +6 -0
  34. data/lib/imagemaster3000/errors/action_error.rb +5 -0
  35. data/lib/imagemaster3000/errors/argument_error.rb +5 -0
  36. data/lib/imagemaster3000/errors/command_execution_error.rb +5 -0
  37. data/lib/imagemaster3000/errors/download_error.rb +5 -0
  38. data/lib/imagemaster3000/errors/parsing_error.rb +5 -0
  39. data/lib/imagemaster3000/errors/standard_error.rb +5 -0
  40. data/lib/imagemaster3000/errors/verification_error.rb +5 -0
  41. data/lib/imagemaster3000/errors.rb +11 -0
  42. data/lib/imagemaster3000/image_list/generator.rb +25 -0
  43. data/lib/imagemaster3000/image_list/signer.rb +18 -0
  44. data/lib/imagemaster3000/image_list/templates/image_list.erb +41 -0
  45. data/lib/imagemaster3000/image_list.rb +6 -0
  46. data/lib/imagemaster3000/main_process.rb +22 -0
  47. data/lib/imagemaster3000/settings.rb +19 -0
  48. data/lib/imagemaster3000/utils/command_executioner.rb +22 -0
  49. data/lib/imagemaster3000/utils/crypto.rb +28 -0
  50. data/lib/imagemaster3000/utils/tmp.rb +24 -0
  51. data/lib/imagemaster3000/utils.rb +7 -0
  52. data/lib/imagemaster3000/verification/hash.rb +45 -0
  53. data/lib/imagemaster3000/verification/signatures/clearsign.rb +16 -0
  54. data/lib/imagemaster3000/verification/signatures/detached.rb +18 -0
  55. data/lib/imagemaster3000/verification/signatures.rb +8 -0
  56. data/lib/imagemaster3000/verification/verifiable.rb +10 -0
  57. data/lib/imagemaster3000/verification.rb +7 -0
  58. data/lib/imagemaster3000/version.rb +3 -0
  59. data/lib/imagemaster3000.rb +18 -0
  60. metadata +347 -0
@@ -0,0 +1,5 @@
1
+ module Imagemaster3000
2
+ module Errors
3
+ class ArgumentError < StandardError; end
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module Imagemaster3000
2
+ module Errors
3
+ class CommandExecutionError < StandardError; end
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module Imagemaster3000
2
+ module Errors
3
+ class DownloadError < StandardError; end
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module Imagemaster3000
2
+ module Errors
3
+ class ParsingError < StandardError; end
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module Imagemaster3000
2
+ module Errors
3
+ class StandardError < ::StandardError; end
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module Imagemaster3000
2
+ module Errors
3
+ class VerificationError < StandardError; end
4
+ end
5
+ end
@@ -0,0 +1,11 @@
1
+ module Imagemaster3000
2
+ module Errors
3
+ autoload :StandardError, 'imagemaster3000/errors/standard_error'
4
+ autoload :ArgumentError, 'imagemaster3000/errors/argument_error'
5
+ autoload :CommandExecutionError, 'imagemaster3000/errors/command_execution_error'
6
+ autoload :ActionError, 'imagemaster3000/errors/action_error'
7
+ autoload :VerificationError, 'imagemaster3000/errors/verification_error'
8
+ autoload :DownloadError, 'imagemaster3000/errors/download_error'
9
+ autoload :ParsingError, 'imagemaster3000/errors/parsing_error'
10
+ end
11
+ end
@@ -0,0 +1,25 @@
1
+ require 'openssl'
2
+ require 'tilt'
3
+ require 'erb'
4
+
5
+ module Imagemaster3000
6
+ module ImageList
7
+ class Generator
8
+ class << self
9
+ def generate(images)
10
+ template_file = File.join(File.dirname(__FILE__), 'templates', 'image_list.erb')
11
+ raise Imagemaster3000::Errors::ArgumentError, 'Missing image list template file' unless File.exist?(template_file)
12
+
13
+ logger.debug "Populating template from #{template_file}"
14
+
15
+ template = Tilt::ERBTemplate.new template_file, trim: '-'
16
+ rendered = template.render Object.new, images: images
17
+
18
+ logger.debug "Image list:\n#{rendered}"
19
+
20
+ rendered
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,18 @@
1
+ require 'openssl'
2
+
3
+ module Imagemaster3000
4
+ module ImageList
5
+ class Signer
6
+ class << self
7
+ def sign(image_list_data)
8
+ logger.debug "Signing image list with certificate #{Imagemaster3000::Settings[:certificate].inspect} " \
9
+ "and key #{Imagemaster3000::Settings[:key].inspect}"
10
+ cert = OpenSSL::X509::Certificate.new File.new(Imagemaster3000::Settings[:certificate])
11
+ key = OpenSSL::PKey.read File.new(Imagemaster3000::Settings[:key])
12
+ pkcs7 = OpenSSL::PKCS7.sign cert, key, image_list_data, [], OpenSSL::PKCS7::DETACHED
13
+ OpenSSL::PKCS7.write_smime pkcs7
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,41 @@
1
+ {
2
+ "hv:imagelist":{
3
+ "dc:date:created":"<%= Time.now.strftime('%Y-%m-%dT%H:%M:%SZ') %>",
4
+ "dc:date:expires":"<%= (Time.now + 6.months).strftime('%Y-%m-%dT%H:%M:%SZ') %>",
5
+ "dc:description":"CESNET MetaCloud image list",
6
+ "dc:identifier":"imagemaster3000-metacloud",
7
+ "dc:source":"https://cloud.metacentrum.cz/",
8
+ "dc:title":"CESNET MetaCloud",
9
+ "ad:vo": "<%= Imagemaster3000::Settings[:group] %>",
10
+ "hv:images":[
11
+ <% images.each_with_index do |image, index| -%>
12
+ {
13
+ "hv:image":{
14
+ "dc:description":"<%= image.name %>",
15
+ "dc:identifier":"<%= image.name %>",
16
+ "ad:mpuri":"imagemaster3000-metacloud",
17
+ "dc:title":"<%= image.name %>",
18
+ "hv:hypervisor":"QEMU-KVM",
19
+ <% if image.ram -%>
20
+ "hv:ram_minimum": "<%= image.ram %>",
21
+ <% end -%>
22
+ <% if image.cpu -%>
23
+ "hv:core_minimum": "<%= image.cpu %>",
24
+ <% end -%>
25
+ "hv:format":"qcow2",
26
+ "hv:size":"<%= image.size %>",
27
+ "hv:uri":"<%= File.join(Imagemaster3000::Settings[:endpoint], File.basename(image.file)) %>",
28
+ "hv:version":"<%= image.version %>",
29
+ <% if image.verification -%>
30
+ "sl:checksum:sha512":"<%= image.verification[:hash][:checksum] %>",
31
+ <% end -%>
32
+ "sl:os":"Linux",
33
+ "sl:osname":"<%= image.distribution %>",
34
+ "sl:osversion":"<%= image.version %>",
35
+ "sl:arch": "x86_64"
36
+ }
37
+ }<%= ',' if index < (images.size - 1) %>
38
+ <% end -%>
39
+ ]
40
+ }
41
+ }
@@ -0,0 +1,6 @@
1
+ module Imagemaster3000
2
+ module ImageList
3
+ autoload :Generator, 'imagemaster3000/image_list/generator'
4
+ autoload :Signer, 'imagemaster3000/image_list/signer'
5
+ end
6
+ end
@@ -0,0 +1,22 @@
1
+ module Imagemaster3000
2
+ class MainProcess
3
+ def run
4
+ logger.debug 'Loading images from definitions'
5
+ images = Imagemaster3000::Definitions::Parser.parse_image_definitions
6
+ logger.debug 'Processing images'
7
+ images.each { |image| process_image image }
8
+
9
+ logger.debug 'Generating image list'
10
+ image_list = Imagemaster3000::ImageList::Signer.sign(Imagemaster3000::ImageList::Generator.generate(images))
11
+ File.write Imagemaster3000::Settings[:'image-list'], image_list
12
+ end
13
+
14
+ private
15
+
16
+ def process_image(image)
17
+ image.download
18
+ image.verify! if image.respond_to? :verify!
19
+ image.actions.each { |action| action.run image.file } unless image.actions.blank?
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,19 @@
1
+ require 'settingslogic'
2
+
3
+ module Imagemaster3000
4
+ class Settings < Settingslogic
5
+ CONFIGURATION = 'imagemaster3000.yml'.freeze
6
+
7
+ # three possible configuration file locations in order by preference
8
+ # if configuration file is found rest of the locations are ignored
9
+ source "#{ENV['HOME']}/.imagemaster3000/#{CONFIGURATION}"\
10
+ if File.exist?("#{ENV['HOME']}/.imagemaster3000/#{CONFIGURATION}")
11
+
12
+ source "/etc/imagemaster3000/#{CONFIGURATION}"\
13
+ if File.exist?("/etc/imagemaster3000/#{CONFIGURATION}")
14
+
15
+ source "#{File.dirname(__FILE__)}/../../config/#{CONFIGURATION}"
16
+
17
+ namespace 'imagemaster3000'
18
+ end
19
+ end
@@ -0,0 +1,22 @@
1
+ require 'mixlib/shellout'
2
+
3
+ module Imagemaster3000
4
+ module Utils
5
+ class CommandExecutioner
6
+ class << self
7
+ def execute(*args)
8
+ command = Mixlib::ShellOut.new(*args)
9
+ logger.debug "Executing command: #{command.command.inspect}"
10
+ command.run_command
11
+
12
+ if command.error?
13
+ raise Imagemaster3000::Errors::CommandExecutionError, "Command #{command.command.inspect} terminated with an error: " \
14
+ "#{command.stderr}"
15
+ end
16
+
17
+ command.stdout
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,28 @@
1
+ module Imagemaster3000
2
+ module Utils
3
+ class Crypto
4
+ def self.verify_clearsign(file)
5
+ logger.debug "Verifying clearsign signature for file #{file.path.inspect}"
6
+ verify [file], "Verification failed on file #{file.path.inspect}"
7
+ end
8
+
9
+ def self.verify_detached(signature, data)
10
+ logger.debug "Verifying detached signature for file #{data.path.inspect} and signature #{signature.path.inspect}"
11
+ verify [signature, { signed_text: data }],
12
+ "Verification failed on file #{data.path.inspect} with signature #{signature.path.inspect}",
13
+ data
14
+ end
15
+
16
+ def self.verify(arguments, message, return_value = nil)
17
+ crypto = ::GPGME::Crypto.new
18
+ output = crypto.send(:verify, *arguments) do |signature|
19
+ raise Imagemaster3000::Errors::VerificationError, "#{message}: #{signature}" unless signature.valid?
20
+ end
21
+
22
+ output = return_value if return_value
23
+ output.seek 0
24
+ output.read
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,24 @@
1
+ require 'open-uri'
2
+ require 'tempfile'
3
+
4
+ module Imagemaster3000
5
+ module Utils
6
+ class Tmp
7
+ def self.download(url)
8
+ file = Tempfile.new('imagemaster3000')
9
+ download = open(url)
10
+ logger.debug "Downloading file from url #{url} to tempfile #{file.path.inspect}"
11
+ IO.copy_stream(download, file)
12
+
13
+ file.rewind
14
+ file
15
+ end
16
+
17
+ def self.destroy(file)
18
+ logger.debug "Closing tempfile #{file.path.inspect}"
19
+ file.close
20
+ file.unlink
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,7 @@
1
+ module Imagemaster3000
2
+ module Utils
3
+ autoload :Tmp, 'imagemaster3000/utils/tmp'
4
+ autoload :Crypto, 'imagemaster3000/utils/crypto'
5
+ autoload :CommandExecutioner, 'imagemaster3000/utils/command_executioner'
6
+ end
7
+ end
@@ -0,0 +1,45 @@
1
+ module Imagemaster3000
2
+ module Verification
3
+ module Hash
4
+ def verify_hash!
5
+ logger.debug 'Verifying checksum'
6
+ checksum = find_checksum!
7
+ computed_checksum = verification[:hash][:function].file(file).hexdigest
8
+
9
+ if checksum == computed_checksum
10
+ verification[:hash][:checksum] = ::Digest::SHA512.file(file).hexdigest
11
+ return
12
+ end
13
+
14
+ raise Imagemaster3000::Errors::VerificationError,
15
+ "Checksum mismatch for file #{file}: expected: #{checksum}, was: #{computed_checksum}"
16
+ end
17
+
18
+ private
19
+
20
+ def find_checksum!
21
+ split_checksum find_checksum_line
22
+ end
23
+
24
+ def find_checksum_line
25
+ checksum_list = verification[:hash][:list]
26
+ filename = File.basename(file)
27
+
28
+ logger.debug "Looking for filename #{filename.inspect} in list \n#{checksum_list}"
29
+
30
+ found_lines = checksum_list.lines.grep(/#{filename}\s*$/)
31
+ raise Imagemaster3000::Errors::VerificationError, "Cannot identify checksum for file #{file.inspect}" \
32
+ unless found_lines.count == 1
33
+
34
+ checksum_line = found_lines.first
35
+ logger.debug "Found mathcing line #{checksum_line.inspect}"
36
+
37
+ checksum_line
38
+ end
39
+
40
+ def split_checksum(checksum_line)
41
+ checksum_line.split.first
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,16 @@
1
+ module Imagemaster3000
2
+ module Verification
3
+ module Signatures
4
+ module Clearsign
5
+ def verify_signature!
6
+ tmp_file = Imagemaster3000::Utils::Tmp.download verification[:signature][:file]
7
+ verification[:hash][:list] = Imagemaster3000::Utils::Crypto.verify_clearsign tmp_file
8
+ rescue ::GPGME::Error => ex
9
+ raise Imagemaster3000::Errors::VerificationError, ex
10
+ ensure
11
+ Imagemaster3000::Utils::Tmp.destroy tmp_file
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ module Imagemaster3000
2
+ module Verification
3
+ module Signatures
4
+ module Detached
5
+ def verify_signature!
6
+ signature_tmp_file = Imagemaster3000::Utils::Tmp.download verification[:signature][:signature]
7
+ data_tmp_file = Imagemaster3000::Utils::Tmp.download verification[:signature][:data]
8
+ verification[:hash][:list] = Imagemaster3000::Utils::Crypto.verify_detached signature_tmp_file, data_tmp_file
9
+ rescue ::GPGME::Error => ex
10
+ raise Imagemaster3000::Errors::VerificationError, ex
11
+ ensure
12
+ Imagemaster3000::Utils::Tmp.destroy signature_tmp_file
13
+ Imagemaster3000::Utils::Tmp.destroy data_tmp_file
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,8 @@
1
+ module Imagemaster3000
2
+ module Verification
3
+ module Signatures
4
+ autoload :Detached, 'imagemaster3000/verification/signatures/detached'
5
+ autoload :Clearsign, 'imagemaster3000/verification/signatures/clearsign'
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,10 @@
1
+ module Imagemaster3000
2
+ module Verification
3
+ module Verifiable
4
+ def verify!
5
+ verify_signature!
6
+ verify_hash!
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ module Imagemaster3000
2
+ module Verification
3
+ autoload :Verifiable, 'imagemaster3000/verification/verifiable'
4
+ autoload :Hash, 'imagemaster3000/verification/hash'
5
+ autoload :Signatures, 'imagemaster3000/verification/signatures'
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module Imagemaster3000
2
+ VERSION = '0.1.0'.freeze
3
+ end
@@ -0,0 +1,18 @@
1
+ require 'active_support/all'
2
+ require 'gpgme'
3
+
4
+ module Imagemaster3000
5
+ autoload :CLI, 'imagemaster3000/cli'
6
+ autoload :Settings, 'imagemaster3000/settings'
7
+ autoload :MainProcess, 'imagemaster3000/main_process'
8
+
9
+ autoload :Errors, 'imagemaster3000/errors'
10
+ autoload :Entities, 'imagemaster3000/entities'
11
+ autoload :Verification, 'imagemaster3000/verification'
12
+ autoload :Actions, 'imagemaster3000/actions'
13
+ autoload :Utils, 'imagemaster3000/utils'
14
+ autoload :ImageList, 'imagemaster3000/image_list'
15
+ autoload :Definitions, 'imagemaster3000/definitions'
16
+ end
17
+
18
+ require 'imagemaster3000/version'
metadata ADDED
@@ -0,0 +1,347 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: imagemaster3000
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Michal Kimle
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-06-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.15'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.15'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '12.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '12.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.5'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.48'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.48'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop-rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.15'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.15'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.12'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.12'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.10'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.10'
111
+ - !ruby/object:Gem::Dependency
112
+ name: vcr
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '3.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '3.0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: webmock
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '3.0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '3.0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: thor
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '0.19'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '0.19'
153
+ - !ruby/object:Gem::Dependency
154
+ name: yell
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '2.0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '2.0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: settingslogic
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '2.0'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '2.0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: activesupport
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '4.0'
188
+ - - "<"
189
+ - !ruby/object:Gem::Version
190
+ version: '6.0'
191
+ type: :runtime
192
+ prerelease: false
193
+ version_requirements: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - ">="
196
+ - !ruby/object:Gem::Version
197
+ version: '4.0'
198
+ - - "<"
199
+ - !ruby/object:Gem::Version
200
+ version: '6.0'
201
+ - !ruby/object:Gem::Dependency
202
+ name: tilt
203
+ requirement: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - "~>"
206
+ - !ruby/object:Gem::Version
207
+ version: '2.0'
208
+ type: :runtime
209
+ prerelease: false
210
+ version_requirements: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: '2.0'
215
+ - !ruby/object:Gem::Dependency
216
+ name: gpgme
217
+ requirement: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: '2.0'
222
+ type: :runtime
223
+ prerelease: false
224
+ version_requirements: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - "~>"
227
+ - !ruby/object:Gem::Version
228
+ version: '2.0'
229
+ - !ruby/object:Gem::Dependency
230
+ name: mixlib-shellout
231
+ requirement: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - "~>"
234
+ - !ruby/object:Gem::Version
235
+ version: '2.2'
236
+ type: :runtime
237
+ prerelease: false
238
+ version_requirements: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - "~>"
241
+ - !ruby/object:Gem::Version
242
+ version: '2.2'
243
+ - !ruby/object:Gem::Dependency
244
+ name: json-schema
245
+ requirement: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - "~>"
248
+ - !ruby/object:Gem::Version
249
+ version: '2.8'
250
+ type: :runtime
251
+ prerelease: false
252
+ version_requirements: !ruby/object:Gem::Requirement
253
+ requirements:
254
+ - - "~>"
255
+ - !ruby/object:Gem::Version
256
+ version: '2.8'
257
+ description: Downloading and slight modification of cloud images
258
+ email:
259
+ - kimle.michal@gmail.com
260
+ executables:
261
+ - imagemaster3000
262
+ extensions: []
263
+ extra_rdoc_files: []
264
+ files:
265
+ - ".gitignore"
266
+ - ".rspec"
267
+ - ".rubocop.yml"
268
+ - ".travis.yml"
269
+ - CODE_OF_CONDUCT.md
270
+ - Gemfile
271
+ - LICENSE.txt
272
+ - README.md
273
+ - Rakefile
274
+ - bin/imagemaster3000
275
+ - config/definitions/centos-7.json
276
+ - config/definitions/debian-8.json
277
+ - config/definitions/files/.gitkeep
278
+ - config/definitions/files/centos-cloud.cfg
279
+ - config/definitions/files/debian-cloud.cfg
280
+ - config/definitions/files/serial-getty@ttyS0.service
281
+ - config/definitions/files/ttyS0.conf
282
+ - config/definitions/files/ubuntu-cloud.cfg
283
+ - config/definitions/ubuntu-14.04.json
284
+ - config/definitions/ubuntu-16.04.json
285
+ - config/imagemaster3000.yml
286
+ - imagemaster3000.gemspec
287
+ - lib/imagemaster3000.rb
288
+ - lib/imagemaster3000/actions.rb
289
+ - lib/imagemaster3000/actions/copy.rb
290
+ - lib/imagemaster3000/actions/remove.rb
291
+ - lib/imagemaster3000/cli.rb
292
+ - lib/imagemaster3000/definitions.rb
293
+ - lib/imagemaster3000/definitions/parser.rb
294
+ - lib/imagemaster3000/definitions/schemas/imagemaster3000-definition-schema.json
295
+ - lib/imagemaster3000/entities.rb
296
+ - lib/imagemaster3000/entities/downloadable.rb
297
+ - lib/imagemaster3000/entities/image.rb
298
+ - lib/imagemaster3000/errors.rb
299
+ - lib/imagemaster3000/errors/action_error.rb
300
+ - lib/imagemaster3000/errors/argument_error.rb
301
+ - lib/imagemaster3000/errors/command_execution_error.rb
302
+ - lib/imagemaster3000/errors/download_error.rb
303
+ - lib/imagemaster3000/errors/parsing_error.rb
304
+ - lib/imagemaster3000/errors/standard_error.rb
305
+ - lib/imagemaster3000/errors/verification_error.rb
306
+ - lib/imagemaster3000/image_list.rb
307
+ - lib/imagemaster3000/image_list/generator.rb
308
+ - lib/imagemaster3000/image_list/signer.rb
309
+ - lib/imagemaster3000/image_list/templates/image_list.erb
310
+ - lib/imagemaster3000/main_process.rb
311
+ - lib/imagemaster3000/settings.rb
312
+ - lib/imagemaster3000/utils.rb
313
+ - lib/imagemaster3000/utils/command_executioner.rb
314
+ - lib/imagemaster3000/utils/crypto.rb
315
+ - lib/imagemaster3000/utils/tmp.rb
316
+ - lib/imagemaster3000/verification.rb
317
+ - lib/imagemaster3000/verification/hash.rb
318
+ - lib/imagemaster3000/verification/signatures.rb
319
+ - lib/imagemaster3000/verification/signatures/clearsign.rb
320
+ - lib/imagemaster3000/verification/signatures/detached.rb
321
+ - lib/imagemaster3000/verification/verifiable.rb
322
+ - lib/imagemaster3000/version.rb
323
+ homepage: https://github.com/Misenko/imagemaster3000
324
+ licenses:
325
+ - Apache License, Version 2.0
326
+ metadata: {}
327
+ post_install_message:
328
+ rdoc_options: []
329
+ require_paths:
330
+ - lib
331
+ required_ruby_version: !ruby/object:Gem::Requirement
332
+ requirements:
333
+ - - ">="
334
+ - !ruby/object:Gem::Version
335
+ version: 2.2.0
336
+ required_rubygems_version: !ruby/object:Gem::Requirement
337
+ requirements:
338
+ - - ">="
339
+ - !ruby/object:Gem::Version
340
+ version: '0'
341
+ requirements: []
342
+ rubyforge_project:
343
+ rubygems_version: 2.6.10
344
+ signing_key:
345
+ specification_version: 4
346
+ summary: Downloading and slight modification of cloud images
347
+ test_files: []