simp-metadata 0.4.3

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 (62) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +0 -0
  3. data/Rakefile +69 -0
  4. data/exe/simp-install +8 -0
  5. data/exe/simp-media +8 -0
  6. data/exe/simp-metadata +8 -0
  7. data/lib/simp/install.rb +0 -0
  8. data/lib/simp/install/command.rb +70 -0
  9. data/lib/simp/media.rb +9 -0
  10. data/lib/simp/media/command.rb +69 -0
  11. data/lib/simp/media/engine.rb +104 -0
  12. data/lib/simp/media/type.rb +14 -0
  13. data/lib/simp/media/type/base.rb +63 -0
  14. data/lib/simp/media/type/control-repo.rb +211 -0
  15. data/lib/simp/media/type/internet.rb +38 -0
  16. data/lib/simp/media/type/iso.rb +9 -0
  17. data/lib/simp/media/type/local.rb +36 -0
  18. data/lib/simp/media/type/tar.rb +71 -0
  19. data/lib/simp/metadata.rb +416 -0
  20. data/lib/simp/metadata/bootstrap_source.rb +137 -0
  21. data/lib/simp/metadata/buildinfo.rb +58 -0
  22. data/lib/simp/metadata/command.rb +92 -0
  23. data/lib/simp/metadata/commands.rb +21 -0
  24. data/lib/simp/metadata/commands/base.rb +65 -0
  25. data/lib/simp/metadata/commands/clone.rb +26 -0
  26. data/lib/simp/metadata/commands/component.rb +109 -0
  27. data/lib/simp/metadata/commands/delete.rb +26 -0
  28. data/lib/simp/metadata/commands/pry.rb +19 -0
  29. data/lib/simp/metadata/commands/release.rb +47 -0
  30. data/lib/simp/metadata/commands/releases.rb +24 -0
  31. data/lib/simp/metadata/commands/save.rb +33 -0
  32. data/lib/simp/metadata/commands/script.rb +38 -0
  33. data/lib/simp/metadata/commands/search.rb +65 -0
  34. data/lib/simp/metadata/commands/set-write-url.rb +19 -0
  35. data/lib/simp/metadata/commands/set-write.rb +19 -0
  36. data/lib/simp/metadata/commands/update.rb +46 -0
  37. data/lib/simp/metadata/component.rb +388 -0
  38. data/lib/simp/metadata/components.rb +70 -0
  39. data/lib/simp/metadata/engine.rb +101 -0
  40. data/lib/simp/metadata/fake_uri.rb +19 -0
  41. data/lib/simp/metadata/git_ssh_wrapper.sh +6 -0
  42. data/lib/simp/metadata/location.rb +198 -0
  43. data/lib/simp/metadata/locations.rb +54 -0
  44. data/lib/simp/metadata/release.rb +119 -0
  45. data/lib/simp/metadata/releases.rb +57 -0
  46. data/lib/simp/metadata/source.rb +204 -0
  47. data/spec/simp/media/command_spec.rb +12 -0
  48. data/spec/simp/media/engine_spec.rb +28 -0
  49. data/spec/simp/media/type/control_repo_spec.rb +23 -0
  50. data/spec/simp/media/type/internet_spec.rb +29 -0
  51. data/spec/simp/media/type/iso_spec.rb +15 -0
  52. data/spec/simp/media/type/local_spec.rb +16 -0
  53. data/spec/simp/media/type/tar_spec.rb +16 -0
  54. data/spec/simp/metadata/buildinfo_spec.rb +64 -0
  55. data/spec/simp/metadata/commands/clone_spec.rb +8 -0
  56. data/spec/simp/metadata/component_spec.rb +90 -0
  57. data/spec/simp/metadata/engine_spec.rb +70 -0
  58. data/spec/simp/metadata/release_spec.rb +104 -0
  59. data/spec/simp/metadata/source_spec.rb +25 -0
  60. data/spec/simp/metadata_spec.rb +175 -0
  61. data/spec/spec_helper.rb +40 -0
  62. metadata +260 -0
@@ -0,0 +1,211 @@
1
+ module Simp
2
+ module Media
3
+ module Type
4
+ class Control_repo < Simp::Media::Type::Base
5
+ attr_accessor :options
6
+ def initialize(options, engine)
7
+ super(options, engine)
8
+ @cleanup = []
9
+ if (options["output"] == nil)
10
+ raise "output must be specified for control-repo output"
11
+ end
12
+ @origtempdir = Dir.mktmpdir("cachedir")
13
+ @repopath = "#{@origtempdir}/control-repo"
14
+ FileUtils.mkdir_p(@repopath)
15
+ @cleanup << @origtempdir
16
+ exit_code = run("git clone #{options["output"]} #{@repopath}")
17
+ unless (exit_code.success?)
18
+ uri = URI(options["output"])
19
+ if (uri.scheme == "file")
20
+ FileUtils.mkdir_p(uri.path)
21
+ Dir.chdir(uri.path) do |path|
22
+ if (uri.path =~ /.*\.git$/)
23
+ run("git init --bare")
24
+ else
25
+ run("git init")
26
+ end
27
+
28
+ run("git clone #{options["output"]} #{@repopath}")
29
+ end
30
+ else
31
+ raise "output is not a valid control-repo"
32
+ end
33
+ end
34
+ Dir.chdir(@repopath) do |path|
35
+ exit_code = run("git checkout #{options["branch"]}")
36
+ unless exit_code.success?
37
+ exit_code = run("git checkout -b #{options["branch"]}")
38
+ unless (exit_code.success?)
39
+ raise "error, unable to checkout #{options["branch"]} in git repo #{uri}"
40
+ end
41
+ end
42
+ @branch = options["branch"]
43
+ if (options["destination_branch"] != nil)
44
+ @branch = options["destination_branch"]
45
+ exit_code = run("git checkout -b #{options["destination_branch"]}")
46
+ unless exit_code.success?
47
+ raise "error, unable to create branch #{options["destination_branch"]} in git repo #{uri}"
48
+ end
49
+ end
50
+ run("rm -rf SIMP/modules")
51
+ run("rm -rf SIMP/assets")
52
+ end
53
+ end
54
+
55
+ def add_component(component, fetch_return_value)
56
+ if (options["embed"] == true)
57
+ # XXX ToDo: Copy components to control-repo if embed == true
58
+ case component.component_type
59
+ when "documentation"
60
+ when "simp-metadata"
61
+ subdirectory = "SIMP/metadata"
62
+ outputpath = "#{@repopath}/#{subdirectory}/#{component.name}"
63
+ FileUtils.mkdir_p(outputpath)
64
+ if (Dir.exists?("#{fetch_return_value['path']}/.git"))
65
+ exit_code = run("cd #{fetch_return_value['path']} && git --work-tree=\"#{outputpath}\" checkout #{component.version} .")
66
+ else
67
+ exit_code = run("cd #{fetch_return_value['path']} && tar -cf - . | tar -xvpf - -C \"#{outputpath}\"")
68
+ end
69
+
70
+ unless exit_code.success?
71
+ error "unable to copy #{component.name} to #{outputpath}: error code #{exit_code.exitstatus}"
72
+ end
73
+ when "puppet-module"
74
+ subdirectory = "SIMP/modules"
75
+ outputpath = "#{@repopath}/#{subdirectory}/#{component.module_name}"
76
+ debug2("Copying #{component.module_name} to #{outputpath}")
77
+ FileUtils.mkdir_p(outputpath)
78
+ exit_code = run("cd #{fetch_return_value['path']} && git --work-tree=\"#{outputpath}\" checkout #{component.version} .")
79
+ unless exit_code.success?
80
+ error "unable to copy #{component.module_name} to #{outputpath}: error code #{exit_code.exitstatus}"
81
+ end
82
+ else
83
+ subdirectory = "SIMP/assets/#{component.name}"
84
+ case component.output_type
85
+ when :file
86
+ FileUtils.mkdir_p("#{@repopath}/#{subdirectory}")
87
+ FileUtils.cp(fetch_return_value["path"], "#{@repopath}/#{subdirectory}/#{component.output_filename}")
88
+ end
89
+ end
90
+ else
91
+ # XXX ToDo: Add necessary references to generate the puppetfile during finalize
92
+ raise "not yet implemented"
93
+ end
94
+
95
+ end
96
+
97
+ def finalize(manifest)
98
+ # XXX ToDo: Generate Puppetfile (if options["embed"] == false)
99
+ # Otherwise copy to control-repo
100
+ # XXX ToDo: Munge Puppetfile
101
+ environmentconf = "#{@repopath}/environment.conf"
102
+ hierayaml = "#{@repopath}/hiera.yaml"
103
+ # XXX ToDo: Munge hiera.yaml
104
+ self.munge_hierayaml(hierayaml)
105
+ if (options["embed"] == true)
106
+ self.munge_environmentconf(environmentconf)
107
+ end
108
+ run("cd #{@repopath} && git add -A")
109
+ run("cd #{@repopath} && git commit -m \"simp-install: upgrade to #{options["version"]}\"")
110
+ run("cd #{@repopath} && git push origin #{@branch}")
111
+ end
112
+
113
+ def munge_environmentconf(environmentconf)
114
+ # Munge environment.conf to add SIMP/modules to modulepath
115
+ if (File.exists?(environmentconf))
116
+ data = File.read(environmentconf).split("\n")
117
+ data.each_with_index do |line, fileline|
118
+ if (/^modulepath = (?<capture>.*)$/ =~ line)
119
+ paths = capture.split(":")
120
+ found = false
121
+ module_index = nil
122
+ paths.each_with_index do |path, index|
123
+ if (path =~ /modules/)
124
+ module_index = index
125
+ end
126
+ if (path =~ /simp\/modules/)
127
+ found = true
128
+ end
129
+ end
130
+ if (found == false)
131
+ newarray = []
132
+ paths.each do |path, index|
133
+ newarray << path
134
+ if (index == module_index)
135
+ newarray << "SIMP/modules"
136
+ end
137
+ end
138
+ data[fileline] = "modulepath = #{newarray.join(":")}"
139
+ File.open(environmentconf, "w") { |f| f.write(data.join("\n")) }
140
+ end
141
+ end
142
+ end
143
+ else
144
+ File.open(environmentconf, "w") { |f| f.write("modulepath = modules:SIMP/modules:$basemodulepath\n") }
145
+ end
146
+ end
147
+
148
+ def munge_hierayaml(hierayaml)
149
+ data = {}
150
+ if (File.exists?(hierayaml))
151
+ data = YAML.load(File.read(hierayaml))
152
+ version = data["version"]
153
+ case version
154
+ when 4
155
+ # XXX ToDo: Add version 4 hiera.yaml support
156
+ raise "currently version 4 hiera.yaml's are not supported"
157
+ when 5
158
+ found = false
159
+ data["hierarchy"].each_with_index do |hash|
160
+ if (hash["lookup_key"] == "compliance_markup::enforcement")
161
+ found = true
162
+ end
163
+ end
164
+ if (found == false)
165
+ hash = {"name" => "SIMP Compliance Engine", "lookup_key" => "compliance_markup::enforcement"}
166
+ data["hierarchy"] << hash
167
+ end
168
+ when nil
169
+ # XXX ToDo: Add version 3 hiera.yaml support
170
+ raise "currently version 3 hiera.yaml's are not supported"
171
+ return 0
172
+ end
173
+ else
174
+ raw_yaml = <<-EOF
175
+ ---
176
+ version: 5
177
+ defaults:
178
+ datadir: "data"
179
+ data_hash: "yaml_data"
180
+ hierarchy:
181
+ - name: 'SIMP Defaults'
182
+ paths:
183
+ - 'hosts/%{trusted.certname}'
184
+ - 'domains/%{facts.domain}'
185
+ - '%{facts.os.family}'
186
+ - '%{facts.os.name}/%{facts.os.release.full}'
187
+ - '%{facts.os.name}/%{facts.os.release.major}'
188
+ - '%{facts.os.name}'
189
+ - 'hostgroups/%{::hostgroup}'
190
+ - 'hosttypes/%{::hosttype}'
191
+ - 'users'
192
+ - 'groups'
193
+ - 'type/%{::nodetype}/common.yaml'
194
+ - 'default'
195
+ - 'simp_config_settings'
196
+ - name: 'SIMP Compliance Engine'
197
+ lookup_key: 'compliance_markup::enforcement'
198
+ EOF
199
+ data = YAML.load(raw_yaml)
200
+ end
201
+ File.open(hierayaml, "w") { |f| f.write(data.to_yaml)}
202
+ end
203
+ def cleanup()
204
+ @cleanup.each do |path|
205
+ FileUtils.rmtree(path)
206
+ end
207
+ end
208
+ end
209
+ end
210
+ end
211
+ end
@@ -0,0 +1,38 @@
1
+
2
+ require 'open3'
3
+
4
+ module Simp
5
+ module Media
6
+ module Type
7
+ class Internet < Simp::Media::Type::Base
8
+ attr_accessor :options
9
+ def initialize(options, engine)
10
+ @cleanup = []
11
+ super(options, engine)
12
+ end
13
+
14
+ def input_directory=(directory)
15
+ @input_directory = directory
16
+ end
17
+ def input_directory
18
+ if (@input_directory == nil)
19
+ target = Dir.mktmpdir("cachedir")
20
+ @cleanup << target
21
+ @input_directory = target
22
+ else
23
+ @input_directory
24
+ end
25
+ end
26
+ def fetch_component(component, options)
27
+ Simp::Metadata.download_component(component, options.merge({"target" => self.input_directory}))
28
+ end
29
+
30
+ def cleanup()
31
+ @cleanup.each do |path|
32
+ FileUtils.rmtree(path)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,9 @@
1
+ module Simp
2
+ module Media
3
+ module Type
4
+ class Iso < Simp::Media::Type::Base
5
+
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,36 @@
1
+ require 'fileutils'
2
+ module Simp
3
+ module Media
4
+ module Type
5
+ class Local < Simp::Media::Type::Base
6
+ def input_directory=(directory)
7
+ @input_directory = directory
8
+ end
9
+ def input_directory
10
+ @options["input"]
11
+ end
12
+ def fetch_component(component, options)
13
+ retval = {}
14
+
15
+ case component.class.to_s
16
+ when "String"
17
+ retval["path"] = "#{options["input"]}/simp/metadata/#{component.name}"
18
+ when "Simp::Metadata::Component"
19
+ # XXX ToDo: Add manifest.yaml support so we don't need this logic at all
20
+ case component.component_type
21
+ when "documentation"
22
+ subdirectory = "simp/docs"
23
+ when "puppet-module"
24
+ subdirectory = "simp/modules"
25
+ else
26
+ subdirectory = "simp/assets"
27
+ end
28
+
29
+ retval["path"] = "#{options["input"]}/#{subdirectory}/#{component.name}"
30
+ end
31
+ return retval
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,71 @@
1
+ require 'fileutils'
2
+ module Simp
3
+ module Media
4
+ module Type
5
+ class Tar < Simp::Media::Type::Base
6
+
7
+ def initialize(options, engine)
8
+ @cleanup = []
9
+
10
+ @origtempdir = Dir.mktmpdir("cachedir")
11
+ @tempdir = @origtempdir + "/" + File.basename(options["output"], ".*")
12
+ @cleanup << @origtempdir
13
+ super(options, engine)
14
+ end
15
+
16
+ def add_component(component, fetch_return_value)
17
+ case component.component_type
18
+ when "documentation"
19
+ subdirectory = "SIMP/docs"
20
+ when "simp-metadata"
21
+ subdirectory = "SIMP/metadata"
22
+ when "puppet-module"
23
+ subdirectory = "SIMP/modules"
24
+ else
25
+ subdirectory = "SIMP/assets/#{component.name}"
26
+ end
27
+ case component.output_type
28
+ when :directory
29
+ if (Dir.exists?(fetch_return_value["path"]))
30
+ unless (Dir.exists?(@tempdir + "/#{subdirectory}/#{component.name}"))
31
+ FileUtils.mkdir_p(@tempdir + "/#{subdirectory}/#{component.name}")
32
+ end
33
+ FileUtils.cp_r(fetch_return_value["path"] + "/.", @tempdir + "/#{subdirectory}/#{component.output_filename}")
34
+ else
35
+ raise "Unable to find component #{component.name} in input source: path=#{fetch_return_value["path"]}"
36
+ end
37
+ when :file
38
+ if (File.exists?(fetch_return_value["path"]))
39
+ FileUtils.mkdir_p(@tempdir + "/#{subdirectory}")
40
+ FileUtils.cp_r(fetch_return_value["path"], @tempdir + "/#{subdirectory}/#{component.output_filename}")
41
+ else
42
+ raise "Unable to find component #{component.name} in input source: path=#{fetch_return_value["path"]}"
43
+ end
44
+ end
45
+
46
+ end
47
+
48
+ def finalize(manifest)
49
+ if @options.key?("local_directory")
50
+ if Dir.exists?(@options["local_directory"])
51
+ FileUtils.cp_r(Dir.glob(@options["local_directory"] + "/*"), @tempdir)
52
+ end
53
+ end
54
+ Dir.chdir(@origtempdir) do
55
+ `tar -cf - * | gzip -9nc >#{@options["output"]}`
56
+ end
57
+ end
58
+
59
+ def output(options, directory, version, metadata, output)
60
+ metadata.releases[version].components.each do |component|
61
+ end
62
+ end
63
+ def cleanup()
64
+ @cleanup.each do |path|
65
+ FileUtils.rmtree(path)
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,416 @@
1
+ # vim: set expandtab ts=2 sw=2:
2
+ require 'open3'
3
+ require 'tempfile'
4
+ require 'tmpdir'
5
+ require 'net/http'
6
+ require 'uri'
7
+ require 'openssl'
8
+ require 'json'
9
+ require 'simp/metadata/engine'
10
+ require 'simp/metadata/fake_uri'
11
+
12
+ require 'simp/metadata/source'
13
+ require 'simp/metadata/bootstrap_source'
14
+
15
+ require 'simp/metadata/releases'
16
+ require 'simp/metadata/release'
17
+
18
+ require 'simp/metadata/components'
19
+ require 'simp/metadata/component'
20
+ require 'simp/metadata/buildinfo'
21
+
22
+ require 'simp/metadata/locations'
23
+ require 'simp/metadata/location'
24
+
25
+ module Simp
26
+ module Metadata
27
+
28
+ def self.directory_name(component, options)
29
+ if (options["target"] != nil)
30
+ basedir = options["target"]
31
+ else
32
+ raise "Must specify 'target'"
33
+ end
34
+ case component.class.to_s
35
+ when "String"
36
+ "#{basedir}/#{component}"
37
+ when "Simp::Metadata::Component"
38
+ "#{basedir}/#{component.output_filename}"
39
+ end
40
+ end
41
+
42
+ # XXX: ToDo this entire logic stream is crappy.
43
+ # We need to replace this with a much more simplified version.
44
+ def self.download_component(component, options)
45
+ directory_name = self.directory_name(component, options)
46
+ retval = {}
47
+ case component.class.to_s
48
+ when "String"
49
+ retval["path"] = self.directory_name(component, options)
50
+ # XXX: ToDo We can bootstrap this with a hard coded source in the simp engine
51
+ bootstrapped_components = {
52
+ "simp-metadata" => {
53
+ "url" => "https://github.com/simp/simp-metadata",
54
+ "method" => "git"
55
+ },
56
+ "enterprise-metadata" => {
57
+ "url" => "simp-enterprise:///enterprise-metadata?version=master&filetype=tgz",
58
+ "method" => "file",
59
+ "extract" => true,
60
+ },
61
+ }
62
+ # All this should be removed and be based on component.file_type
63
+ componentspec = bootstrapped_components[component]
64
+ if (componentspec["extract"] == true)
65
+ tarball = "#{directory_name}.tgz"
66
+ fetch_from_url(componentspec, tarball, nil, options)
67
+ unless Dir.exists?(retval["path"])
68
+ Dir.mkdir(retval["path"])
69
+ end
70
+ `tar -xvpf #{tarball} -C #{retval["path"]}`
71
+ else
72
+ fetch_from_url(componentspec, retval["path"], nil, options)
73
+ end
74
+ when "Simp::Metadata::Component"
75
+ retval["path"] = directory_name
76
+ if (options["url"])
77
+ location = component.primary
78
+ location.url = options["url"]
79
+ urlspec = location
80
+ location.method = "git"
81
+ else
82
+ urlspec = component.primary
83
+ end
84
+ fetch_from_url(urlspec, retval["path"], component, options)
85
+ else
86
+ raise "component.class=#{component.class.to_s}, #{component.class.to_s} is not in ['String', 'Simp::Metadata::Component']"
87
+ end
88
+ return retval
89
+ end
90
+
91
+ def self.uri(url)
92
+ case url
93
+ when /git@/
94
+ uri = Simp::Metadata::FakeURI.new(uri)
95
+ uri.scheme = "ssh"
96
+ uri
97
+ else
98
+ URI(url)
99
+ end
100
+ end
101
+
102
+ def self.fetch_from_url(urlspec, target, component = nil, options)
103
+ case urlspec.class.to_s
104
+ when "Simp::Metadata::Location"
105
+ url = urlspec.url
106
+ uri = uri(url)
107
+ method = urlspec.method
108
+ when "Hash"
109
+ url = urlspec["url"]
110
+ uri = uri(urlspec["url"])
111
+ if (urlspec.key?("method"))
112
+ method = urlspec["method"]
113
+ else
114
+ # XXX ToDo remove once the upstream simp-metadata has been updated so type != method
115
+ if (urlspec.key?("type"))
116
+ if (urlspec["type"] == "git")
117
+ method = "git"
118
+ else
119
+ method = "file"
120
+ end
121
+ else
122
+ method = "file"
123
+ end
124
+ end
125
+ when "String"
126
+ url = urlspec
127
+ uri = uri(urlspec)
128
+ method = "file"
129
+ end
130
+ case method
131
+ when "git"
132
+ case uri.scheme
133
+ when "simp"
134
+ fetch_simp_enterprise(url, target, component, urlspec, options)
135
+ when "simp-enterprise"
136
+ fetch_simp_enterprise(url, target, component, urlspec, options)
137
+ else
138
+ unless (Dir.exists?(target))
139
+ info("Cloning from #{url}")
140
+ run("git clone #{url} #{target}")
141
+ else
142
+ Dir.chdir(target) do
143
+ info("Updating from #{url}")
144
+ run("git pull origin")
145
+ end
146
+ end
147
+ end
148
+ when "file"
149
+ case uri.scheme
150
+ when "simp"
151
+ fetch_simp_enterprise(url, target, component, urlspec, options)
152
+ when "simp-enterprise"
153
+ fetch_simp_enterprise(url, target, component, urlspec, options)
154
+ when "http"
155
+ fetch_simp_enterprise(url, target, component, urlspec, options)
156
+ when "https"
157
+ fetch_simp_enterprise(url, target, component, urlspec, options)
158
+ else
159
+ raise "unsupported url type #{uri.scheme}"
160
+ end
161
+ end
162
+ end
163
+
164
+ def self.get_license_data(filename)
165
+ ret_filename = nil
166
+ ret_data = ""
167
+ license_data = ENV.fetch('SIMP_LICENSE_KEY', nil)
168
+ if (license_data != nil)
169
+ # Environment data trumps all
170
+ ret_data = license_data
171
+ if ($simp_license_temp == nil)
172
+ $simp_license_temp = Tempfile.new('license_data')
173
+ $simp_license_temp.write(license_data)
174
+ end
175
+ ret_filename = $simp_license_temp.path
176
+ else
177
+ if (filename.class.to_s == "String")
178
+ # Attempt to load from the filename passed
179
+ ret_filename = filename
180
+ else
181
+ # Try to load from /etc/simp/license.key file
182
+ ret_filename = "/etc/simp/license.key"
183
+ end
184
+ if (File.exists?(ret_filename))
185
+ ret_data = File.read(ret_filename)
186
+ else
187
+ if ($simp_license_temp == nil)
188
+ $simp_license_temp = Tempfile.new('license_data')
189
+ $simp_license_temp.write("")
190
+ end
191
+ ret_filename = $simp_license_temp.path
192
+ end
193
+ end
194
+ return ret_filename, ret_data
195
+ end
196
+
197
+ def self.fetch_simp_enterprise(url, destination, component, location = nil, options)
198
+ if (location.class.to_s == "Simp::Metadata::Location")
199
+ extract = location.extract
200
+ else
201
+ extract = false
202
+ end
203
+ uri = uri(url)
204
+ case uri.scheme
205
+ when "simp-enterprise"
206
+ scheme = "https"
207
+ host = 'enterprise-download.simp-project.com'
208
+ filetype = 'tgz'
209
+ if (component != nil)
210
+ if (component.extension != "")
211
+ filetype = component.extension
212
+ end
213
+ end
214
+ version = 'latest'
215
+ if (component != nil)
216
+ if (component.version != "")
217
+ version = component.version
218
+ end
219
+ end
220
+ if (uri.query != nil)
221
+ uri.query.split("&").each do |element|
222
+ if (element.class.to_s == "String")
223
+ elements = element.split("=")
224
+ if (elements.size > 1)
225
+ case elements[0]
226
+ when "version"
227
+ version = elements[1]
228
+ when "filetype"
229
+ filetype = elements[1]
230
+ end
231
+ end
232
+ end
233
+ end
234
+ end
235
+
236
+ if (component != nil)
237
+ name = "/#{component.name}/#{component.binaryname}"
238
+ else
239
+ name = "#{uri.path}#{uri.path}#{name}-#{version}.#{filetype}"
240
+ end
241
+ path = "/products/simp-enterprise#{name}"
242
+ when "simp"
243
+ scheme = "https"
244
+ host = 'download.simp-project.com'
245
+ filetype = 'tgz'
246
+ if (component != nil)
247
+ if (component.extension != "")
248
+ filetype = component.extension
249
+ end
250
+ end
251
+ version = 'latest'
252
+ if (component != nil)
253
+ if (component.version != "")
254
+ version = component.version
255
+ end
256
+ end
257
+ if (uri.query != nil)
258
+ uri.query.split("&").each do |element|
259
+ if (element.class.to_s == "String")
260
+ elements = element.split("=")
261
+ if (elements.size > 1)
262
+ case elements[0]
263
+ when "version"
264
+ version = elements[1]
265
+ when "filetype"
266
+ filetype = elements[1]
267
+ end
268
+ end
269
+ end
270
+ end
271
+ end
272
+ if (component != nil)
273
+ name = "/#{component.name}/#{component.binaryname}"
274
+ else
275
+ name = "#{uri.path}#{uri.path}#{name}-#{version}.#{filetype}"
276
+ end
277
+ path = "/SIMP/assets#{name}"
278
+ else
279
+ scheme = uri.scheme
280
+ host = uri.host
281
+ path = uri.path
282
+ end
283
+ port = uri.port ? uri.port : 443
284
+ http = Net::HTTP.new(host, port)
285
+ case scheme
286
+ when "https"
287
+ http.use_ssl = true
288
+ case uri.scheme
289
+ when "simp-enterprise"
290
+ filename, data = self.get_license_data(options["license"])
291
+ unless (filename == nil)
292
+ http.ca_file = filename
293
+ end
294
+ unless (data == nil)
295
+ http.cert = OpenSSL::X509::Certificate.new(data)
296
+ http.key = OpenSSL::PKey::RSA.new(data)
297
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
298
+ end
299
+
300
+ debug2("using the following certificate (#{filename}) for client certificate auth: #{http.cert.subject}")
301
+ end
302
+ end
303
+ info("Fetching from #{scheme}://#{host}:#{port}#{path}")
304
+ req = Net::HTTP::Get.new(path)
305
+ response = http.request(req)
306
+ case response.code
307
+ when '200'
308
+ if (extract == true)
309
+ File.open("#{destination}.tgz", 'w') do |f|
310
+ f.write response.body
311
+ end
312
+ FileUtils.mkdir_p(destination)
313
+ run("tar -xvpf #{destination}.tgz -C #{destination}")
314
+ else
315
+ File.open(destination, 'w') do |f|
316
+ f.write response.body
317
+ end
318
+ end
319
+ when '302'
320
+ fetch_simp_enterprise(response['location'], destination, component, location)
321
+ when '301'
322
+ fetch_simp_enterprise(response['location'], destination, component, location)
323
+ else
324
+ $errorcode = response.code.to_i
325
+ raise "HTTP Error Code: #{response.code}"
326
+ end
327
+ end
328
+
329
+ def self.run(command)
330
+ exitcode = nil
331
+ Open3.popen3(command) do |stdin, stdout, stderr, thread|
332
+ pid = thread.pid
333
+ Simp::Metadata.debug2(stdout.read.chomp)
334
+ Simp::Metadata.debug1(stderr.read.chomp)
335
+ exitcode = thread.value
336
+ end
337
+ exitcode
338
+ end
339
+
340
+ def self.level?(level)
341
+ setlevel = Simp::Metadata.convert_level($simp_metadata_debug_level)
342
+ checklevel = Simp::Metadata.convert_level(level)
343
+ if (checklevel <= setlevel)
344
+ true
345
+ else
346
+ false
347
+ end
348
+ end
349
+
350
+ def self.convert_level(level)
351
+ case level
352
+ when 'disabled'
353
+ 0
354
+ when 'critical'
355
+ 1
356
+ when 'error'
357
+ 2
358
+ when 'warning'
359
+ 3
360
+ when 'info'
361
+ 4
362
+ when 'debug1'
363
+ 5
364
+ when 'debug2'
365
+ 6
366
+ else
367
+ 3
368
+ end
369
+ end
370
+
371
+ def self.print_message(prefix, message)
372
+ message.split("\n").each do |line|
373
+ output = "#{prefix}: #{line}"
374
+ unless ($simp_metadata_debug_output_disabled == true)
375
+ STDERR.puts output
376
+ end
377
+ end
378
+ end
379
+
380
+ def self.debug1(message)
381
+ if Simp::Metadata.level?('debug1')
382
+ Simp::Metadata.print_message("DEBUG1", message)
383
+ end
384
+ end
385
+
386
+ def self.debug2(message)
387
+ if Simp::Metadata.level?('debug2')
388
+ Simp::Metadata.print_message("DEBUG2", message)
389
+ end
390
+ end
391
+
392
+ def self.info(message)
393
+ if Simp::Metadata.level?('info')
394
+ Simp::Metadata.print_message("INFO", message)
395
+ end
396
+ end
397
+
398
+ def self.warning(message)
399
+ if Simp::Metadata.level?('warning')
400
+ Simp::Metadata.print_message("WARN", message)
401
+ end
402
+ end
403
+
404
+ def self.error(message)
405
+ if Simp::Metadata.level?('error')
406
+ Simp::Metadata.print_message("ERROR", message)
407
+ end
408
+ end
409
+
410
+ def self.critical(message)
411
+ if Simp::Metadata.level?('critical')
412
+ Simp::Metadata.print_message("CRITICAL", message)
413
+ end
414
+ end
415
+ end
416
+ end