mixlib-install 0.8.0.alpha.7 → 0.8.0.alpha.8
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 +4 -4
- data/PRODUCT_MATRIX.md +5 -5
- data/config.ru +7 -0
- data/lib/mixlib/install/artifact_info.rb +10 -7
- data/lib/mixlib/install/backend.rb +4 -3
- data/lib/mixlib/install/backend/artifactory.rb +9 -13
- data/lib/mixlib/install/backend/base.rb +39 -0
- data/lib/mixlib/install/backend/bintray.rb +266 -0
- data/lib/mixlib/install/backend/omnitruck.rb +5 -6
- data/lib/mixlib/install/generator/bourne/scripts/artifactory_urls.sh.erb +0 -3
- data/lib/mixlib/install/generator/bourne/scripts/fetch_metadata.sh.erb +1 -3
- data/lib/mixlib/install/generator/bourne/scripts/fetch_package.sh +2 -2
- data/lib/mixlib/install/generator/bourne/scripts/helpers.sh +1 -10
- data/lib/mixlib/install/generator/powershell.rb +5 -5
- data/lib/mixlib/install/generator/powershell/scripts/get_project_metadata.ps1.erb +2 -2
- data/lib/mixlib/install/generator/powershell/scripts/get_project_metadata_for_artifactory.ps1.erb +2 -3
- data/lib/mixlib/install/options.rb +13 -26
- data/lib/mixlib/install/product.rb +22 -22
- data/lib/mixlib/install/version.rb +1 -1
- data/mixlib-install.gemspec +1 -0
- metadata +19 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fe243313ad84e3ae88dc0708806eb15c43f76a11
|
4
|
+
data.tar.gz: 470d541528a8c2d1f7147632f43a1e932e7dd875
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f5a37cf8df4a56bb141995f514899895a61634fa2bd7a8d09373bfd17cd95709411c32017991867caccb61ab96e860cadbdfc5ae0accd59ce961e5209d933bc7
|
7
|
+
data.tar.gz: 94cf89573f423781f835a31ec99290b9fcefc71758c44ee7b18142c112b1ba18bd7852ac32390f56906ef968755aced6830486ed79569796eca47cfa006071f3
|
data/PRODUCT_MATRIX.md
CHANGED
@@ -5,21 +5,21 @@
|
|
5
5
|
| Angry Chef Client | angrychef |
|
6
6
|
| Chef Client | chef |
|
7
7
|
| Chef Backend | chef-backend |
|
8
|
-
| Chef Server High Availability addon | chef-ha |
|
9
|
-
| Chef Cloud Marketplace addon | chef-marketplace |
|
10
8
|
| Chef Server | chef-server |
|
11
9
|
| Chef Server HA Provisioning for AWS | chef-server-ha-provisioning |
|
12
|
-
| Chef Server Replication addon | chef-sync |
|
13
10
|
| Chef Development Kit | chefdk |
|
14
11
|
| Chef Compliance | compliance |
|
15
12
|
| Delivery | delivery |
|
16
13
|
| Delivery CLI | delivery-cli |
|
14
|
+
| Chef Server High Availability addon | ha |
|
17
15
|
| Management Console | manage |
|
16
|
+
| Chef Cloud Marketplace addon | marketplace |
|
18
17
|
| Omnibus Toolchain | omnibus-toolchain |
|
19
18
|
| Enterprise Chef (legacy) | private-chef |
|
20
|
-
| Chef Push Server | push-client |
|
21
|
-
| Chef Push Server | push-server |
|
19
|
+
| Chef Push Server | push-jobs-client |
|
20
|
+
| Chef Push Server | push-jobs-server |
|
22
21
|
| Chef Server Reporting addon | reporting |
|
23
22
|
| Supermarket | supermarket |
|
23
|
+
| Chef Server Replication addon | sync |
|
24
24
|
|
25
25
|
Do not modify this file manually. It is automatically rendered via a rake task.
|
data/config.ru
ADDED
@@ -19,19 +19,21 @@
|
|
19
19
|
module Mixlib
|
20
20
|
class Install
|
21
21
|
class ArtifactInfo
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
attr_reader :url
|
23
|
+
attr_reader :md5
|
24
|
+
attr_reader :sha256
|
25
|
+
attr_reader :sha1
|
26
|
+
attr_reader :version
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
|
28
|
+
attr_reader :platform
|
29
|
+
attr_reader :platform_version
|
30
|
+
attr_reader :architecture
|
30
31
|
|
31
32
|
def initialize(data)
|
32
33
|
@url = data[:url]
|
33
34
|
@md5 = data[:md5]
|
34
35
|
@sha256 = data[:sha256]
|
36
|
+
@sha1 = data[:sha1]
|
35
37
|
@version = data[:version]
|
36
38
|
@platform = data[:platform]
|
37
39
|
@platform_version = data[:platform_version]
|
@@ -65,6 +67,7 @@ module Mixlib
|
|
65
67
|
url: url,
|
66
68
|
md5: md5,
|
67
69
|
sha256: sha256,
|
70
|
+
sha1: sha1,
|
68
71
|
version: version,
|
69
72
|
platform: platform,
|
70
73
|
platform_version: platform_version,
|
@@ -18,15 +18,16 @@
|
|
18
18
|
|
19
19
|
require "mixlib/install/backend/omnitruck"
|
20
20
|
require "mixlib/install/backend/artifactory"
|
21
|
+
require "mixlib/install/backend/bintray"
|
21
22
|
|
22
23
|
module Mixlib
|
23
24
|
class Install
|
24
25
|
class Backend
|
25
26
|
def self.info(options)
|
26
|
-
backend = if options.
|
27
|
-
Backend::Omnitruck.new(options)
|
28
|
-
elsif options.for_artifactory?
|
27
|
+
backend = if options.for_artifactory?
|
29
28
|
Backend::Artifactory.new(options)
|
29
|
+
else
|
30
|
+
Backend::Omnitruck.new(options)
|
30
31
|
end
|
31
32
|
|
32
33
|
backend.info
|
@@ -20,23 +20,18 @@ require "net/http"
|
|
20
20
|
require "json"
|
21
21
|
require "mixlib/install/artifact_info"
|
22
22
|
require "artifactory"
|
23
|
+
require "mixlib/install/backend/base"
|
23
24
|
|
24
25
|
module Mixlib
|
25
26
|
class Install
|
26
27
|
class Backend
|
27
|
-
class Artifactory
|
28
|
+
class Artifactory < Base
|
28
29
|
class ConnectionError < StandardError; end
|
29
30
|
class AuthenticationError < StandardError; end
|
30
31
|
class NoArtifactsError < StandardError; end
|
31
32
|
|
32
33
|
ENDPOINT = "http://artifactory.chef.co".freeze
|
33
34
|
|
34
|
-
attr_accessor :options
|
35
|
-
|
36
|
-
def initialize(options)
|
37
|
-
@options = options
|
38
|
-
end
|
39
|
-
|
40
35
|
# Create filtered list of artifacts
|
41
36
|
#
|
42
37
|
# @return [Array<ArtifactInfo>] list of artifacts for the configured
|
@@ -109,13 +104,14 @@ Can not find any builds for #{options.product_name} in #{::Artifactory.endpoint}
|
|
109
104
|
#
|
110
105
|
# @return [Array<ArtifactInfo>] Array of info about found artifacts
|
111
106
|
def artifactory_artifacts(version)
|
112
|
-
results = artifactory_query(<<-QUERY
|
107
|
+
results = artifactory_query(<<-QUERY
|
113
108
|
items.find(
|
114
109
|
{"repo": "omnibus-#{options.channel}-local"},
|
115
110
|
{"@omnibus.project": "#{options.product_name}"},
|
116
111
|
{"@omnibus.version": "#{version}"}
|
117
112
|
).include("repo", "path", "name", "property")
|
118
113
|
QUERY
|
114
|
+
)
|
119
115
|
|
120
116
|
# Merge artifactory properties and downloadUri to a flat Hash
|
121
117
|
results.collect! do |result|
|
@@ -191,16 +187,16 @@ items.find(
|
|
191
187
|
begin
|
192
188
|
results = yield
|
193
189
|
rescue Errno::ETIMEDOUT, ::Artifactory::Error::ConnectionError
|
194
|
-
raise ConnectionError, <<-
|
195
|
-
Artifactory endpoint '#{
|
190
|
+
raise ConnectionError, <<-MSG
|
191
|
+
Artifactory endpoint '#{endpoint}' is unreachable. Check that
|
196
192
|
the endpoint is correct and there is an open connection to Chef's private network.
|
197
|
-
|
193
|
+
MSG
|
198
194
|
rescue ::Artifactory::Error::HTTPError => e
|
199
195
|
if e.code == 401 && e.message =~ /Bad credentials/
|
200
|
-
raise AuthenticationError, <<-
|
196
|
+
raise AuthenticationError, <<-MSG
|
201
197
|
Artifactory server denied credentials. Verify ARTIFACTORY_USERNAME and
|
202
198
|
ARTIFACTORY_PASSWORD environment variables are configured properly.
|
203
|
-
|
199
|
+
MSG
|
204
200
|
else
|
205
201
|
raise e
|
206
202
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Patrick Wright (<patrick@chef.io>)
|
3
|
+
# Copyright:: Copyright (c) 2016 Chef, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
module Mixlib
|
20
|
+
class Install
|
21
|
+
class Backend
|
22
|
+
class Base
|
23
|
+
attr_reader :options
|
24
|
+
|
25
|
+
def initialize(options)
|
26
|
+
@options = options
|
27
|
+
end
|
28
|
+
|
29
|
+
def info
|
30
|
+
raise "Must implement info method that returns ArtifactInfo or Array<ArtifactInfo>"
|
31
|
+
end
|
32
|
+
|
33
|
+
def endpoint
|
34
|
+
raise "Must implement endpoint method that returns endpoint String"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,266 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Patrick Wright (<patrick@chef.io>)
|
3
|
+
# Copyright:: Copyright (c) 2016 Chef, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require "json"
|
20
|
+
require "mixlib/install/backend/base"
|
21
|
+
require "mixlib/install/artifact_info"
|
22
|
+
|
23
|
+
#
|
24
|
+
# Add method to Array class to support
|
25
|
+
# searching for substrings that match against
|
26
|
+
# the items in the Array
|
27
|
+
#
|
28
|
+
class Array
|
29
|
+
def fuzzy_include?(search_value, regex_format = "%s")
|
30
|
+
inject(false) do |is_found, array_value|
|
31
|
+
is_found || !!(search_value =~ /#{regex_format % array_value}/)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module Mixlib
|
37
|
+
class Install
|
38
|
+
class Backend
|
39
|
+
class Bintray < Base
|
40
|
+
class UnknownArchitecture < StandardError; end
|
41
|
+
|
42
|
+
ENDPOINT = "https://bintray.com/api/v1/".freeze
|
43
|
+
|
44
|
+
# Bintray credentials for api read access. These are here intentionally.
|
45
|
+
BINTRAY_USERNAME = "mixlib-install@chef".freeze
|
46
|
+
|
47
|
+
BINTRAY_PASSWORD = "a83d3a2ffad50eb9a2230f281a2e19b70fe0db2d".freeze
|
48
|
+
|
49
|
+
DOWNLOAD_URL_ENDPOINT = "https://packages.chef.io".freeze
|
50
|
+
|
51
|
+
def endpoint
|
52
|
+
@endpoint ||= ENV.fetch("BINTRAY_ENDPOINT", ENDPOINT)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Create filtered list of artifacts
|
56
|
+
#
|
57
|
+
# @return [Array<ArtifactInfo>] list of artifacts for the configured
|
58
|
+
# channel, product name, and product version.
|
59
|
+
# @return [ArtifactInfo] arifact info for the configured
|
60
|
+
# channel, product name, product version and platform info
|
61
|
+
#
|
62
|
+
def info
|
63
|
+
artifacts = bintray_artifacts
|
64
|
+
|
65
|
+
if options.platform
|
66
|
+
artifacts.select! do |a|
|
67
|
+
a.platform == options.platform &&
|
68
|
+
a.platform_version == options.platform_version &&
|
69
|
+
a.architecture == options.architecture
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
artifacts.length == 1 ? artifacts.first : artifacts
|
74
|
+
end
|
75
|
+
|
76
|
+
#
|
77
|
+
# Makes a GET request to bintray for the given path.
|
78
|
+
#
|
79
|
+
# @param [String] path
|
80
|
+
# "/api/v1/packages/chef" is prepended to the given path.
|
81
|
+
#
|
82
|
+
# @return [String] JSON parsed string of the bintray response
|
83
|
+
#
|
84
|
+
def bintray_get(path)
|
85
|
+
uri = URI.parse(endpoint)
|
86
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
87
|
+
http.use_ssl = (uri.scheme == "https")
|
88
|
+
|
89
|
+
full_path = File.join(uri.path, "packages/chef", path)
|
90
|
+
request = Net::HTTP::Get.new(full_path)
|
91
|
+
request.basic_auth(BINTRAY_USERNAME, BINTRAY_PASSWORD)
|
92
|
+
|
93
|
+
res = http.request(request)
|
94
|
+
|
95
|
+
# Raise if response is not 2XX
|
96
|
+
res.value
|
97
|
+
JSON.parse(res.body)
|
98
|
+
end
|
99
|
+
|
100
|
+
#
|
101
|
+
# Get latest version for product/channel
|
102
|
+
#
|
103
|
+
# @return [String] latest version value
|
104
|
+
#
|
105
|
+
def latest_version
|
106
|
+
result = bintray_get("#{options.channel}/#{options.product_name}/versions/_latest")
|
107
|
+
result["name"]
|
108
|
+
end
|
109
|
+
|
110
|
+
#
|
111
|
+
# Get artifacts for a given version, channel and product_name
|
112
|
+
#
|
113
|
+
# @return [Array<ArtifactInfo>] Array of info about found artifacts
|
114
|
+
#
|
115
|
+
def bintray_artifacts
|
116
|
+
version = options.product_version == :latest ? latest_version : options.product_version
|
117
|
+
results = bintray_get("#{options.channel}/#{options.product_name}/versions/#{version}/files")
|
118
|
+
|
119
|
+
#
|
120
|
+
# Delete .asc files
|
121
|
+
# Also delete .pkg files which are uploaded along with dmg files for
|
122
|
+
# some chef versions.
|
123
|
+
#
|
124
|
+
results.reject! do |r|
|
125
|
+
r["name"].end_with?(".asc") || r["name"].end_with?(".pkg")
|
126
|
+
end
|
127
|
+
|
128
|
+
# Convert results to build records
|
129
|
+
results.map { |a| create_artifact(a) }
|
130
|
+
end
|
131
|
+
|
132
|
+
#
|
133
|
+
# Creates an instance of ArtifactInfo
|
134
|
+
#
|
135
|
+
# @param artifact_map
|
136
|
+
# {
|
137
|
+
# "name" => "chef-12.8.1-1.powerpc.bff",
|
138
|
+
# "path" => "aix/6.1/chef-12.8.1-1.powerpc.bff",
|
139
|
+
# "version" => "12.8.1",
|
140
|
+
# "sha1" => "1206f7be7be8bbece1e9943dcdc0d22fe538718b",
|
141
|
+
# "sha256" => "e49321095a04f51385a59b3f3d7223cd1bddefc2e2f4280edfb0934d00a4fa3f"
|
142
|
+
# }
|
143
|
+
#
|
144
|
+
# @return [ArtifactInfo] ArtifactInfo instance
|
145
|
+
#
|
146
|
+
def create_artifact(artifact_map)
|
147
|
+
platform_info = parse_platform_info(artifact_map)
|
148
|
+
|
149
|
+
url = "#{DOWNLOAD_URL_ENDPOINT}/#{options.channel}/#{artifact_map["path"]}"
|
150
|
+
|
151
|
+
ArtifactInfo.new(
|
152
|
+
sha1: artifact_map["sha1"],
|
153
|
+
sha256: artifact_map["sha256"],
|
154
|
+
version: artifact_map["version"],
|
155
|
+
platform: platform_info[:platform],
|
156
|
+
platform_version: platform_info[:platform_version],
|
157
|
+
architecture: platform_info[:architecture],
|
158
|
+
url: url
|
159
|
+
)
|
160
|
+
end
|
161
|
+
|
162
|
+
#
|
163
|
+
# Parses platform info
|
164
|
+
#
|
165
|
+
# @param artifact_map
|
166
|
+
# {
|
167
|
+
# "name" => "chef-12.8.1-1.powerpc.bff",
|
168
|
+
# "path" => "aix/6.1/chef-12.8.1-1.powerpc.bff",
|
169
|
+
# "version" => "12.8.1",
|
170
|
+
# "sha1" => "1206f7be7be8bbece1e9943dcdc0d22fe538718b",
|
171
|
+
# "sha256" => "e49321095a04f51385a59b3f3d7223cd1bddefc2e2f4280edfb0934d00a4fa3f"
|
172
|
+
# }
|
173
|
+
#
|
174
|
+
# @return [Hash] platform, platform_version, architecture
|
175
|
+
#
|
176
|
+
def parse_platform_info(artifact_map)
|
177
|
+
# platform/platform_version/filename
|
178
|
+
path = artifact_map["path"].split("/")
|
179
|
+
platform = path[0]
|
180
|
+
platform_version = path[1]
|
181
|
+
|
182
|
+
filename = artifact_map["name"]
|
183
|
+
architecture = parse_architecture_from_file_name(filename)
|
184
|
+
|
185
|
+
{
|
186
|
+
platform: platform,
|
187
|
+
platform_version: platform_version,
|
188
|
+
architecture: architecture,
|
189
|
+
}
|
190
|
+
end
|
191
|
+
|
192
|
+
#
|
193
|
+
# Determines the architecture for which a file is published from from
|
194
|
+
# filename.
|
195
|
+
#
|
196
|
+
# We determine the architecture based on the filename of the artifact
|
197
|
+
# since architecture the artifact is published for is not available
|
198
|
+
# in bintray.
|
199
|
+
#
|
200
|
+
# IMPORTANT: This function is heavily used by omnitruck poller. Make
|
201
|
+
# sure you test with `./poller` if you change this function.
|
202
|
+
#
|
203
|
+
# @param [String] filename
|
204
|
+
#
|
205
|
+
# @return [String]
|
206
|
+
# one of the standardized architectures for Chef packages:
|
207
|
+
# x86_64, i386, powerpc, sparc, ppc64, ppc64le
|
208
|
+
def parse_architecture_from_file_name(filename)
|
209
|
+
#
|
210
|
+
# We first map the different variations of architectures that we have
|
211
|
+
# used historically to our final set.
|
212
|
+
#
|
213
|
+
if %w{ x86_64 amd64 x64 }.fuzzy_include?(filename)
|
214
|
+
"x86_64"
|
215
|
+
elsif %w{ i386 x86 i86pc i686 }.fuzzy_include?(filename)
|
216
|
+
"i386"
|
217
|
+
elsif %w{ powerpc }.fuzzy_include?(filename)
|
218
|
+
"powerpc"
|
219
|
+
elsif %w{ sparc sun4u sun4v }.fuzzy_include?(filename)
|
220
|
+
"sparc"
|
221
|
+
# Note that ppc64le should come before ppc64 otherwise our search
|
222
|
+
# will think ppc64le matches ppc64.
|
223
|
+
elsif %w{ ppc64le }.fuzzy_include?(filename)
|
224
|
+
"ppc64le"
|
225
|
+
elsif %w{ ppc64 }.fuzzy_include?(filename)
|
226
|
+
"ppc64"
|
227
|
+
#
|
228
|
+
# From here on we need to deal with historical versions
|
229
|
+
# that we have published without any architecture in their
|
230
|
+
# names.
|
231
|
+
#
|
232
|
+
#
|
233
|
+
# All dmg files are published for x86_64
|
234
|
+
elsif filename.end_with?(".dmg")
|
235
|
+
"x86_64"
|
236
|
+
#
|
237
|
+
# The msi files we catch here are versions that are older than the
|
238
|
+
# ones which we introduced 64 builds. Therefore they should map to
|
239
|
+
# i386
|
240
|
+
elsif filename.end_with?(".msi")
|
241
|
+
"i386"
|
242
|
+
#
|
243
|
+
# sh files are the packaging format we were using before dmg on Mac.
|
244
|
+
# They map to x86_64
|
245
|
+
elsif filename.end_with?(".sh")
|
246
|
+
"x86_64"
|
247
|
+
#
|
248
|
+
# We have two common file names for solaris packages. E.g:
|
249
|
+
# chef-11.12.8-2.solaris2.5.10.solaris
|
250
|
+
# chef-11.12.8-2.solaris2.5.9.solaris
|
251
|
+
# These were build on two boxes:
|
252
|
+
# Solaris 9 => sparc
|
253
|
+
# Solaris 10 => i386
|
254
|
+
elsif filename.end_with?(".solaris2.5.10.solaris")
|
255
|
+
"i386"
|
256
|
+
elsif filename.end_with?(".solaris2.5.9.solaris")
|
257
|
+
"sparc"
|
258
|
+
else
|
259
|
+
raise UnknownArchitecture,
|
260
|
+
"architecture can not be determined for '#{filename}'"
|
261
|
+
end
|
262
|
+
end
|
263
|
+
end
|
264
|
+
end
|
265
|
+
end
|
266
|
+
end
|
@@ -19,17 +19,16 @@
|
|
19
19
|
require "net/http"
|
20
20
|
require "json"
|
21
21
|
require "mixlib/install/artifact_info"
|
22
|
+
require "mixlib/install/backend/base"
|
22
23
|
|
23
24
|
module Mixlib
|
24
25
|
class Install
|
25
26
|
class Backend
|
26
|
-
class Omnitruck
|
27
|
+
class Omnitruck < Base
|
27
28
|
ENDPOINT = "https://omnitruck.chef.io/".freeze
|
28
29
|
|
29
|
-
|
30
|
-
|
31
|
-
def initialize(options)
|
32
|
-
@options = options
|
30
|
+
def endpoint
|
31
|
+
@endpoint ||= ENV.fetch("OMNITRUCK_ENDPOINT", ENDPOINT)
|
33
32
|
end
|
34
33
|
|
35
34
|
def info
|
@@ -55,7 +54,7 @@ module Mixlib
|
|
55
54
|
private
|
56
55
|
|
57
56
|
def omnitruck_get(resource, parameters)
|
58
|
-
uri = URI.parse(
|
57
|
+
uri = URI.parse(endpoint)
|
59
58
|
http = Net::HTTP.new(uri.host, uri.port)
|
60
59
|
http.use_ssl = (uri.scheme == "https")
|
61
60
|
|
@@ -12,7 +12,6 @@
|
|
12
12
|
# Outputs:
|
13
13
|
# $download_url:
|
14
14
|
# $sha256:
|
15
|
-
# $md5:
|
16
15
|
############
|
17
16
|
|
18
17
|
<% artifacts.each do |artifact| %>
|
@@ -20,7 +19,6 @@
|
|
20
19
|
mkdir -p $artifact_info_dir
|
21
20
|
touch "$artifact_info_dir/artifact_info"
|
22
21
|
echo "url <%= artifact.url%>" >> "$artifact_info_dir/artifact_info"
|
23
|
-
echo "md5 <%= artifact.md5%>" >> "$artifact_info_dir/artifact_info"
|
24
22
|
echo "sha256 <%= artifact.sha256%>" >> "$artifact_info_dir/artifact_info"
|
25
23
|
<% end %>
|
26
24
|
|
@@ -28,4 +26,3 @@ artifact_info_for_platform="$tmp_dir/artifact_info/$platform/$platform_version/$
|
|
28
26
|
|
29
27
|
download_url=`awk '$1 == "url" { print $2 }' "$artifact_info_for_platform"`
|
30
28
|
sha256=`awk '$1 == "sha256" { print $2 }' "$artifact_info_for_platform"`
|
31
|
-
md5=`awk '$1 == "md5" { print $2 }' "$artifact_info_for_platform"`
|
@@ -15,7 +15,6 @@
|
|
15
15
|
# Outputs:
|
16
16
|
# $download_url:
|
17
17
|
# $sha256:
|
18
|
-
# $md5:
|
19
18
|
############
|
20
19
|
|
21
20
|
echo "Getting information for $project $channel $version for $platform..."
|
@@ -29,7 +28,7 @@ cat "$metadata_filename"
|
|
29
28
|
|
30
29
|
echo ""
|
31
30
|
# check that all the mandatory fields in the downloaded metadata are there
|
32
|
-
if grep '^url' $metadata_filename > /dev/null && grep '^sha256' $metadata_filename > /dev/null
|
31
|
+
if grep '^url' $metadata_filename > /dev/null && grep '^sha256' $metadata_filename > /dev/null; then
|
33
32
|
echo "downloaded metadata file looks valid..."
|
34
33
|
else
|
35
34
|
echo "downloaded metadata file is corrupted or an uncaught error was encountered in downloading the file..."
|
@@ -41,7 +40,6 @@ fi
|
|
41
40
|
|
42
41
|
download_url=`awk '$1 == "url" { print $2 }' "$metadata_filename"`
|
43
42
|
sha256=`awk '$1 == "sha256" { print $2 }' "$metadata_filename"`
|
44
|
-
md5=`awk '$1 == "md5" { print $2 }' "$metadata_filename"`
|
45
43
|
|
46
44
|
############
|
47
45
|
# end of fetch_metadata.sh
|
@@ -34,7 +34,7 @@ download_dir=`dirname $download_filename`
|
|
34
34
|
cached_file_available="false"
|
35
35
|
if test -f $download_filename; then
|
36
36
|
echo "$download_filename already exists, verifiying checksum..."
|
37
|
-
if do_checksum "$download_filename" "$sha256"
|
37
|
+
if do_checksum "$download_filename" "$sha256"; then
|
38
38
|
echo "checksum compare succeeded, using existing file!"
|
39
39
|
cached_file_available="true"
|
40
40
|
else
|
@@ -45,7 +45,7 @@ fi
|
|
45
45
|
# download if no local version of the file available
|
46
46
|
if test "x$cached_file_available" != "xtrue"; then
|
47
47
|
do_download "$download_url" "$download_filename"
|
48
|
-
do_checksum "$download_filename" "$sha256"
|
48
|
+
do_checksum "$download_filename" "$sha256" || checksum_mismatch
|
49
49
|
fi
|
50
50
|
|
51
51
|
############
|
@@ -214,17 +214,8 @@ do_checksum() {
|
|
214
214
|
echo "Comparing checksum with shasum..."
|
215
215
|
checksum=`shasum -a 256 $1 | awk '{ print $1 }'`
|
216
216
|
return `test "x$checksum" = "x$2"`
|
217
|
-
elif exists md5sum; then
|
218
|
-
echo "Comparing checksum with md5sum..."
|
219
|
-
checksum=`md5sum $1 | awk '{ print $1 }'`
|
220
|
-
return `test "x$checksum" = "x$3"`
|
221
|
-
elif exists md5; then
|
222
|
-
echo "Comparing checksum with md5..."
|
223
|
-
# this is for md5 utility on MacOSX (OSX 10.6-10.10) and $4 is the correct field
|
224
|
-
checksum=`md5 $1 | awk '{ print $4 }'`
|
225
|
-
return `test "x$checksum" = "x$3"`
|
226
217
|
else
|
227
|
-
echo "WARNING: could not find a valid checksum program, pre-install shasum
|
218
|
+
echo "WARNING: could not find a valid checksum program, pre-install shasum or sha256sum in your O/S image to get valdation..."
|
228
219
|
return 0
|
229
220
|
fi
|
230
221
|
}
|
@@ -89,11 +89,11 @@ module Mixlib
|
|
89
89
|
end
|
90
90
|
|
91
91
|
def render_command
|
92
|
-
|
93
|
-
|
94
|
-
-
|
95
|
-
-
|
96
|
-
|
92
|
+
cmd = "install -project #{options.product_name}"
|
93
|
+
cmd << " -version #{product_version}"
|
94
|
+
cmd << " -channel #{options.channel}"
|
95
|
+
cmd << " -architecture #{options.architecture}" if options.architecture
|
96
|
+
cmd << "\n"
|
97
97
|
end
|
98
98
|
end
|
99
99
|
end
|
@@ -7,11 +7,11 @@ function Get-ProjectMetadata {
|
|
7
7
|
.EXAMPLE
|
8
8
|
iex (new-object net.webclient).downloadstring('https://omnitruck.chef.io/install.ps1'); Get-ProjectMetadata -project chef -channel stable
|
9
9
|
|
10
|
-
Gets the download url
|
10
|
+
Gets the download url and SHA256 checksum for the latest stable release of Chef.
|
11
11
|
.EXAMPLE
|
12
12
|
iex (irm 'https://omnitruck.chef.io/install.ps1'); Get-ProjectMetadata -project chefdk -channel stable -version 0.8.0
|
13
13
|
|
14
|
-
Gets the download url
|
14
|
+
Gets the download url and SHA256 checksum for ChefDK 0.8.0.
|
15
15
|
#>
|
16
16
|
[cmdletbinding()]
|
17
17
|
param (
|
data/lib/mixlib/install/generator/powershell/scripts/get_project_metadata_for_artifactory.ps1.erb
CHANGED
@@ -7,11 +7,11 @@ function Get-ProjectMetadata {
|
|
7
7
|
.EXAMPLE
|
8
8
|
iex (new-object net.webclient).downloadstring('https://omnitruck.chef.io/install.ps1'); Get-ProjectMetadata -project chef -channel stable
|
9
9
|
|
10
|
-
Gets the download url
|
10
|
+
Gets the download url and SHA256 checksum for the latest stable release of Chef.
|
11
11
|
.EXAMPLE
|
12
12
|
iex (irm 'https://omnitruck.chef.io/install.ps1'); Get-ProjectMetadata -project chefdk -channel stable -version 0.8.0
|
13
13
|
|
14
|
-
Gets the download url,
|
14
|
+
Gets the download url, and SHA256 checksum for ChefDK 0.8.0.
|
15
15
|
#>
|
16
16
|
[cmdletbinding()]
|
17
17
|
param (
|
@@ -64,7 +64,6 @@ function Get-ProjectMetadata {
|
|
64
64
|
New-Item -ItemType directory -Path $artifact_info_dir -force
|
65
65
|
New-Item -ItemType file "$($artifact_info_dir)/artifact_info" -force
|
66
66
|
"url <%= artifact.url%>" | out-file "$artifact_info_dir/artifact_info"
|
67
|
-
"md5 <%= artifact.md5%>" | out-file "$artifact_info_dir/artifact_info" -Append
|
68
67
|
"sha256 <%= artifact.sha256%>" | out-file "$artifact_info_dir/artifact_info" -Append
|
69
68
|
<% end %>
|
70
69
|
|
@@ -16,6 +16,7 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
18
|
|
19
|
+
require "mixlib/install/product"
|
19
20
|
require "mixlib/versioning"
|
20
21
|
|
21
22
|
module Mixlib
|
@@ -25,21 +26,11 @@ module Mixlib
|
|
25
26
|
class ArtifactoryCredentialsNotFound < StandardError; end
|
26
27
|
|
27
28
|
attr_reader :options
|
28
|
-
attr_reader :defaults
|
29
29
|
|
30
30
|
OMNITRUCK_CHANNELS = [:stable, :current]
|
31
31
|
ARTIFACTORY_CHANNELS = [:unstable]
|
32
32
|
ALL_SUPPORTED_CHANNELS = OMNITRUCK_CHANNELS + ARTIFACTORY_CHANNELS
|
33
|
-
SUPPORTED_PRODUCT_NAMES =
|
34
|
-
angry-omnibus-toolchain
|
35
|
-
angrychef
|
36
|
-
chef
|
37
|
-
chefdk
|
38
|
-
chef-server
|
39
|
-
delivery-cli
|
40
|
-
omnibus-toolchain
|
41
|
-
push-jobs-client
|
42
|
-
}
|
33
|
+
SUPPORTED_PRODUCT_NAMES = PRODUCT_MATRIX.products
|
43
34
|
SUPPORTED_SHELL_TYPES = [:ps1, :sh]
|
44
35
|
SUPPORTED_OPTIONS = [
|
45
36
|
:architecture,
|
@@ -53,9 +44,6 @@ module Mixlib
|
|
53
44
|
|
54
45
|
def initialize(options)
|
55
46
|
@options = options
|
56
|
-
@defaults = {
|
57
|
-
shell_type: :sh,
|
58
|
-
}
|
59
47
|
|
60
48
|
validate!
|
61
49
|
end
|
@@ -70,7 +58,6 @@ module Mixlib
|
|
70
58
|
|
71
59
|
errors << validate_product_names
|
72
60
|
errors << validate_channels
|
73
|
-
errors << validate_platform_info
|
74
61
|
errors << validate_shell_type
|
75
62
|
|
76
63
|
unless errors.compact.empty?
|
@@ -80,7 +67,7 @@ module Mixlib
|
|
80
67
|
|
81
68
|
SUPPORTED_OPTIONS.each do |option|
|
82
69
|
define_method option do
|
83
|
-
options[option] || options[option.to_s] ||
|
70
|
+
options[option] || options[option.to_s] || default_options[option]
|
84
71
|
end
|
85
72
|
end
|
86
73
|
|
@@ -88,6 +75,10 @@ module Mixlib
|
|
88
75
|
ARTIFACTORY_CHANNELS.include?(channel)
|
89
76
|
end
|
90
77
|
|
78
|
+
def for_bintray?
|
79
|
+
[:stable, :current].include?(channel)
|
80
|
+
end
|
81
|
+
|
91
82
|
def for_omnitruck?
|
92
83
|
OMNITRUCK_CHANNELS.include?(channel)
|
93
84
|
end
|
@@ -115,6 +106,12 @@ module Mixlib
|
|
115
106
|
|
116
107
|
private
|
117
108
|
|
109
|
+
def default_options
|
110
|
+
{
|
111
|
+
shell_type: :sh,
|
112
|
+
}
|
113
|
+
end
|
114
|
+
|
118
115
|
def validate_product_names
|
119
116
|
unless SUPPORTED_PRODUCT_NAMES.include? product_name
|
120
117
|
<<-EOS
|
@@ -133,16 +130,6 @@ Must be one of: #{ALL_SUPPORTED_CHANNELS.join(", ")}
|
|
133
130
|
end
|
134
131
|
end
|
135
132
|
|
136
|
-
def validate_platform_info
|
137
|
-
platform_opts = [platform, platform_version, architecture]
|
138
|
-
if (platform_opts.any?(&:nil?)) &&
|
139
|
-
(platform_opts.any? { |opt| !opt.nil? })
|
140
|
-
<<-EOS
|
141
|
-
platform, platform version, and architecture are all required when specifying Platform options.
|
142
|
-
EOS
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
133
|
def validate_shell_type
|
147
134
|
unless SUPPORTED_SHELL_TYPES.include? shell_type
|
148
135
|
<<-EOS
|
@@ -172,19 +172,6 @@ PRODUCT_MATRIX = Mixlib::Install::ProductMatrix.new do
|
|
172
172
|
config_file "/etc/chef-backend/chef-backend.rb"
|
173
173
|
end
|
174
174
|
|
175
|
-
product "chef-ha" do
|
176
|
-
product_name "Chef Server High Availability addon"
|
177
|
-
package_name "chef-ha"
|
178
|
-
config_file "/etc/opscode/chef-server.rb"
|
179
|
-
end
|
180
|
-
|
181
|
-
product "chef-marketplace" do
|
182
|
-
product_name "Chef Cloud Marketplace addon"
|
183
|
-
package_name "chef-marketplace"
|
184
|
-
ctl_command "chef-marketplace-ctl"
|
185
|
-
config_file "/etc/chef-marketplace/marketplace.rb"
|
186
|
-
end
|
187
|
-
|
188
175
|
product "chef-server" do
|
189
176
|
product_name "Chef Server"
|
190
177
|
package_name do |v|
|
@@ -203,13 +190,6 @@ PRODUCT_MATRIX = Mixlib::Install::ProductMatrix.new do
|
|
203
190
|
package_name "chef-server-ha-provisioning"
|
204
191
|
end
|
205
192
|
|
206
|
-
product "chef-sync" do
|
207
|
-
product_name "Chef Server Replication addon"
|
208
|
-
package_name "chef-sync"
|
209
|
-
ctl_command "chef-sync-ctl"
|
210
|
-
config_file "/etc/chef-sync/chef-sync.rb"
|
211
|
-
end
|
212
|
-
|
213
193
|
product "chefdk" do
|
214
194
|
product_name "Chef Development Kit"
|
215
195
|
package_name "chefdk"
|
@@ -234,6 +214,12 @@ PRODUCT_MATRIX = Mixlib::Install::ProductMatrix.new do
|
|
234
214
|
package_name "delivery-cli"
|
235
215
|
end
|
236
216
|
|
217
|
+
product "ha" do
|
218
|
+
product_name "Chef Server High Availability addon"
|
219
|
+
package_name "chef-ha"
|
220
|
+
config_file "/etc/opscode/chef-server.rb"
|
221
|
+
end
|
222
|
+
|
237
223
|
product "manage" do
|
238
224
|
product_name "Management Console"
|
239
225
|
package_name do |v|
|
@@ -251,6 +237,13 @@ PRODUCT_MATRIX = Mixlib::Install::ProductMatrix.new do
|
|
251
237
|
end
|
252
238
|
end
|
253
239
|
|
240
|
+
product "marketplace" do
|
241
|
+
product_name "Chef Cloud Marketplace addon"
|
242
|
+
package_name "chef-marketplace"
|
243
|
+
ctl_command "chef-marketplace-ctl"
|
244
|
+
config_file "/etc/chef-marketplace/marketplace.rb"
|
245
|
+
end
|
246
|
+
|
254
247
|
product "omnibus-toolchain" do
|
255
248
|
product_name "Omnibus Toolchain"
|
256
249
|
package_name "omnibus-toolchain"
|
@@ -263,14 +256,14 @@ PRODUCT_MATRIX = Mixlib::Install::ProductMatrix.new do
|
|
263
256
|
config_file "/etc/opscode/private-chef.rb"
|
264
257
|
end
|
265
258
|
|
266
|
-
product "push-client" do
|
259
|
+
product "push-jobs-client" do
|
267
260
|
product_name "Chef Push Server"
|
268
261
|
package_name do |v|
|
269
262
|
v < version_for("1.3.0") ? "opscode-push-jobs-client" : "push-jobs-client"
|
270
263
|
end
|
271
264
|
end
|
272
265
|
|
273
|
-
product "push-server" do
|
266
|
+
product "push-jobs-server" do
|
274
267
|
product_name "Chef Push Server"
|
275
268
|
package_name "opscode-push-jobs-server"
|
276
269
|
ctl_command "opscode-push-jobs-server-ctl"
|
@@ -290,4 +283,11 @@ PRODUCT_MATRIX = Mixlib::Install::ProductMatrix.new do
|
|
290
283
|
ctl_command "supermarket-ctl"
|
291
284
|
config_file "/etc/supermarket/supermarket.json"
|
292
285
|
end
|
286
|
+
|
287
|
+
product "sync" do
|
288
|
+
product_name "Chef Server Replication addon"
|
289
|
+
package_name "chef-sync"
|
290
|
+
ctl_command "chef-sync-ctl"
|
291
|
+
config_file "/etc/chef-sync/chef-sync.rb"
|
292
|
+
end
|
293
293
|
end
|
data/mixlib-install.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mixlib-install
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.0.alpha.
|
4
|
+
version: 0.8.0.alpha.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thom May
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-03-
|
12
|
+
date: 2016-03-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: artifactory
|
@@ -95,6 +95,20 @@ dependencies:
|
|
95
95
|
- - ">="
|
96
96
|
- !ruby/object:Gem::Version
|
97
97
|
version: '0'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: sinatra
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
98
112
|
description:
|
99
113
|
email:
|
100
114
|
- thom@chef.io
|
@@ -127,10 +141,13 @@ files:
|
|
127
141
|
- acceptance/unstable/.acceptance/acceptance-cookbook/recipes/provision.rb
|
128
142
|
- acceptance/unstable/.acceptance/acceptance-cookbook/recipes/verify.rb
|
129
143
|
- acceptance/unstable/.kitchen.yml
|
144
|
+
- config.ru
|
130
145
|
- lib/mixlib/install.rb
|
131
146
|
- lib/mixlib/install/artifact_info.rb
|
132
147
|
- lib/mixlib/install/backend.rb
|
133
148
|
- lib/mixlib/install/backend/artifactory.rb
|
149
|
+
- lib/mixlib/install/backend/base.rb
|
150
|
+
- lib/mixlib/install/backend/bintray.rb
|
134
151
|
- lib/mixlib/install/backend/omnitruck.rb
|
135
152
|
- lib/mixlib/install/generator.rb
|
136
153
|
- lib/mixlib/install/generator/base.rb
|
@@ -181,4 +198,3 @@ signing_key:
|
|
181
198
|
specification_version: 4
|
182
199
|
summary: A mixin to help with omnitruck installs
|
183
200
|
test_files: []
|
184
|
-
has_rdoc:
|