chef 17.2.29-universal-mingw32 → 17.3.48-universal-mingw32
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/Gemfile +4 -3
- data/chef.gemspec +1 -0
- data/lib/chef/client.rb +1 -1
- data/lib/chef/data_bag.rb +1 -2
- data/lib/chef/data_bag_item.rb +1 -2
- data/lib/chef/deprecated.rb +10 -4
- data/lib/chef/dsl.rb +1 -0
- data/lib/chef/dsl/render_helpers.rb +44 -0
- data/lib/chef/dsl/secret.rb +64 -0
- data/lib/chef/dsl/toml.rb +116 -0
- data/lib/chef/dsl/universal.rb +5 -0
- data/lib/chef/exceptions.rb +22 -0
- data/lib/chef/handler/slow_report.rb +1 -1
- data/lib/chef/json_compat.rb +1 -1
- data/lib/chef/policy_builder/policyfile.rb +88 -45
- data/lib/chef/provider/file.rb +2 -2
- data/lib/chef/provider/lwrp_base.rb +1 -1
- data/lib/chef/provider/package/habitat.rb +168 -0
- data/lib/chef/provider/package/powershell.rb +5 -0
- data/lib/chef/providers.rb +1 -0
- data/lib/chef/resource/chef_client_config.rb +7 -2
- data/lib/chef/resource/chef_client_cron.rb +1 -1
- data/lib/chef/resource/chef_client_launchd.rb +1 -1
- data/lib/chef/resource/chef_client_scheduled_task.rb +1 -1
- data/lib/chef/resource/chef_client_systemd_timer.rb +1 -1
- data/lib/chef/resource/chef_client_trusted_certificate.rb +2 -2
- data/lib/chef/resource/chef_vault_secret.rb +2 -2
- data/lib/chef/resource/dsc_resource.rb +1 -1
- data/lib/chef/resource/execute.rb +3 -3
- data/lib/chef/resource/gem_package.rb +2 -1
- data/lib/chef/resource/habitat/_habitat_shared.rb +28 -0
- data/lib/chef/resource/habitat/habitat_package.rb +129 -0
- data/lib/chef/resource/habitat/habitat_sup.rb +329 -0
- data/lib/chef/resource/habitat/habitat_sup_systemd.rb +67 -0
- data/lib/chef/resource/habitat/habitat_sup_windows.rb +90 -0
- data/lib/chef/resource/habitat_config.rb +107 -0
- data/lib/chef/resource/habitat_install.rb +247 -0
- data/lib/chef/resource/habitat_service.rb +451 -0
- data/lib/chef/resource/habitat_user_toml.rb +92 -0
- data/lib/chef/resource/lwrp_base.rb +1 -1
- data/lib/chef/resource/support/HabService.dll.config.erb +19 -0
- data/lib/chef/resource/support/client.erb +8 -1
- data/lib/chef/resource/support/sup.toml.erb +179 -0
- data/lib/chef/resource/windows_defender.rb +163 -0
- data/lib/chef/resource/windows_defender_exclusion.rb +125 -0
- data/lib/chef/resource/windows_printer.rb +78 -44
- data/lib/chef/resource/windows_printer_port.rb +1 -1
- data/lib/chef/resource/windows_update_settings.rb +259 -0
- data/lib/chef/resources.rb +12 -1
- data/lib/chef/secret_fetcher.rb +54 -0
- data/lib/chef/secret_fetcher/aws_secrets_manager.rb +53 -0
- data/lib/chef/secret_fetcher/azure_key_vault.rb +56 -0
- data/lib/chef/secret_fetcher/base.rb +72 -0
- data/lib/chef/secret_fetcher/example.rb +46 -0
- data/lib/chef/version.rb +1 -1
- data/spec/functional/mixin/from_file_spec.rb +1 -1
- data/spec/integration/recipes/recipe_dsl_spec.rb +1 -1
- data/spec/integration/recipes/resource_action_spec.rb +4 -4
- data/spec/support/shared/unit/provider/file.rb +2 -8
- data/spec/unit/data_bag_item_spec.rb +2 -2
- data/spec/unit/data_bag_spec.rb +1 -1
- data/spec/unit/dsl/render_helpers_spec.rb +102 -0
- data/spec/unit/dsl/secret_spec.rb +65 -0
- data/spec/unit/policy_builder/dynamic_spec.rb +0 -5
- data/spec/unit/policy_builder/policyfile_spec.rb +144 -56
- data/spec/unit/provider/apt_update_spec.rb +3 -1
- data/spec/unit/provider/mount/aix_spec.rb +1 -1
- data/spec/unit/provider/package/powershell_spec.rb +74 -12
- data/spec/unit/resource/windows_defender_exclusion_spec.rb +62 -0
- data/spec/unit/resource/windows_defender_spec.rb +71 -0
- data/spec/unit/resource/windows_update_settings_spec.rb +64 -0
- data/spec/unit/secret_fetcher/azure_key_vault_spec.rb +63 -0
- data/spec/unit/secret_fetcher_spec.rb +82 -0
- metadata +51 -7
data/lib/chef/provider/file.rb
CHANGED
@@ -157,7 +157,7 @@ class Chef
|
|
157
157
|
end
|
158
158
|
|
159
159
|
action :delete do
|
160
|
-
if ::File.
|
160
|
+
if ::File.exist?(new_resource.path)
|
161
161
|
converge_by("delete file #{new_resource.path}") do
|
162
162
|
do_backup unless file_class.symlink?(new_resource.path)
|
163
163
|
::File.delete(new_resource.path)
|
@@ -393,7 +393,7 @@ class Chef
|
|
393
393
|
# a nil tempfile is okay, means the resource has no content or no new content
|
394
394
|
return if tempfile.nil?
|
395
395
|
# but a tempfile that has no path or doesn't exist should not happen
|
396
|
-
if tempfile.path.nil? || !::File.
|
396
|
+
if tempfile.path.nil? || !::File.exist?(tempfile.path)
|
397
397
|
raise "#{ChefUtils::Dist::Infra::CLIENT} is confused, trying to deploy a file that has no path or does not exist..."
|
398
398
|
end
|
399
399
|
|
@@ -0,0 +1,168 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: Chef Software Inc.
|
3
|
+
#
|
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
|
+
require_relative "../../http/simple"
|
19
|
+
require_relative "../../json_compat"
|
20
|
+
require_relative "../../exceptions"
|
21
|
+
require_relative "../package"
|
22
|
+
# Bring in needed shared methods
|
23
|
+
|
24
|
+
class Chef
|
25
|
+
class Provider
|
26
|
+
class Package
|
27
|
+
class Habitat < Chef::Provider::Package
|
28
|
+
use_multipackage_api
|
29
|
+
use "../../resource/habitat/habitat_shared"
|
30
|
+
provides :habitat_package
|
31
|
+
|
32
|
+
def load_current_resource
|
33
|
+
@current_resource = Chef::Resource::HabitatPackage.new(new_resource.name)
|
34
|
+
current_resource.package_name(strip_version(new_resource.package_name))
|
35
|
+
|
36
|
+
@candidate_version = candidate_versions
|
37
|
+
current_resource.version(current_versions)
|
38
|
+
|
39
|
+
current_resource
|
40
|
+
end
|
41
|
+
|
42
|
+
def install_package(names, versions)
|
43
|
+
names.zip(versions).map do |n, v|
|
44
|
+
opts = ["pkg", "install", "--channel", new_resource.channel, "--url", new_resource.bldr_url]
|
45
|
+
opts += ["--auth", new_resource.auth_token] if new_resource.auth_token
|
46
|
+
opts += ["#{strip_version(n)}/#{v}", new_resource.options]
|
47
|
+
opts += ["--binlink"] if new_resource.binlink
|
48
|
+
opts += ["--force"] if new_resource.binlink.eql? :force
|
49
|
+
hab(opts)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
alias_method :upgrade_package, :install_package
|
54
|
+
|
55
|
+
def remove_package(names, versions)
|
56
|
+
# raise 'It is too dangerous to :remove packages with the habitat_package resource right now. This functionality should be deferred to the hab cli.'
|
57
|
+
names.zip(versions).map do |n, v|
|
58
|
+
opts = %w{pkg uninstall}
|
59
|
+
opts += ["--keep-latest", new_resource.keep_latest ] if new_resource.keep_latest
|
60
|
+
opts += ["#{strip_version(n).chomp("/")}#{v}", new_resource.options]
|
61
|
+
opts += ["--exclude"] if new_resource.exclude
|
62
|
+
opts += ["--no-deps"] if new_resource.no_deps
|
63
|
+
hab(opts)
|
64
|
+
# action :remove
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
alias_method :purge_package, :remove_package
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def validate_name!(name)
|
73
|
+
raise ArgumentError, "package name must be specified as 'origin/name', use the 'version' property to specify a version" unless name.squeeze("/").count("/") < 2
|
74
|
+
end
|
75
|
+
|
76
|
+
def strip_version(name)
|
77
|
+
validate_name!(name)
|
78
|
+
n = name.squeeze("/").chomp("/").sub(%r{^\/}, "")
|
79
|
+
n = n[0..(n.rindex("/") - 1)] while n.count("/") >= 2
|
80
|
+
n
|
81
|
+
end
|
82
|
+
|
83
|
+
def platform_target
|
84
|
+
if windows?
|
85
|
+
"target=x86_64-windows"
|
86
|
+
elsif node["kernel"]["release"].to_i < 3
|
87
|
+
"target=x86_64-linux-kernel2"
|
88
|
+
else
|
89
|
+
""
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def depot_package(name, version = nil)
|
94
|
+
@depot_package ||= {}
|
95
|
+
@depot_package[name] ||=
|
96
|
+
begin
|
97
|
+
origin, pkg_name = name.split("/")
|
98
|
+
name_version = [pkg_name, version].compact.join("/").squeeze("/").chomp("/").sub(%r{^\/}, "")
|
99
|
+
url = if new_resource.bldr_url.include?("/v1/")
|
100
|
+
"#{new_resource.bldr_url.chomp("/")}/depot/channels/#{origin}/#{new_resource.channel}/pkgs/#{name_version}"
|
101
|
+
else
|
102
|
+
"#{new_resource.bldr_url.chomp("/")}/v1/depot/channels/#{origin}/#{new_resource.channel}/pkgs/#{name_version}"
|
103
|
+
end
|
104
|
+
url << "/latest" unless name_version.count("/") >= 2
|
105
|
+
url << "?#{platform_target}" unless platform_target.empty?
|
106
|
+
|
107
|
+
headers = {}
|
108
|
+
headers["Authorization"] = "Bearer #{new_resource.auth_token}" if new_resource.auth_token
|
109
|
+
|
110
|
+
Chef::JSONCompat.parse(http.get(url, headers))
|
111
|
+
rescue Net::HTTPServerException
|
112
|
+
nil
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def package_version(name, version = nil)
|
117
|
+
p = depot_package(name, version)
|
118
|
+
"#{p["ident"]["version"]}/#{p["ident"]["release"]}" unless p.nil?
|
119
|
+
end
|
120
|
+
|
121
|
+
def http
|
122
|
+
# FIXME: use SimpleJSON when the depot mime-type is fixed
|
123
|
+
@http ||= Chef::HTTP::Simple.new(new_resource.bldr_url.to_s)
|
124
|
+
end
|
125
|
+
|
126
|
+
def candidate_versions
|
127
|
+
package_name_array.zip(new_version_array).map do |n, v|
|
128
|
+
package_version(n, v)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def current_versions
|
133
|
+
package_name_array.map do |n|
|
134
|
+
installed_version(n)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def installed_version(ident)
|
139
|
+
hab("pkg", "path", ident).stdout.chomp.split(windows? ? "\\" : "/")[-2..-1].join("/")
|
140
|
+
rescue Mixlib::ShellOut::ShellCommandFailed
|
141
|
+
nil
|
142
|
+
end
|
143
|
+
|
144
|
+
# This is used by the superclass Chef::Provider::Package
|
145
|
+
def version_requirement_satisfied?(current_version, new_version)
|
146
|
+
return false if new_version.nil? || current_version.nil?
|
147
|
+
|
148
|
+
nv_parts = new_version.squeeze("/").split("/")
|
149
|
+
|
150
|
+
if nv_parts.count < 2
|
151
|
+
current_version.squeeze("/").split("/")[0] == new_version.squeeze("/")
|
152
|
+
else
|
153
|
+
current_version.squeeze("/") == new_resource.version.squeeze("/")
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
# This is used by the superclass Chef::Provider::Package
|
158
|
+
def version_compare(v1, v2)
|
159
|
+
require "mixlib/versioning" unless defined?(Mixlib::Versioning)
|
160
|
+
# Convert the package version (X.Y.Z/DATE) into a version that Mixlib::Versioning understands (X.Y.Z+DATE)
|
161
|
+
hab_v1 = Mixlib::Versioning.parse(v1.tr("/", "+"))
|
162
|
+
hab_v2 = Mixlib::Versioning.parse(v2.tr("/", "+"))
|
163
|
+
hab_v1 <=> hab_v2
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
@@ -124,6 +124,11 @@ class Chef
|
|
124
124
|
command.push("-RequiredVersion #{version}") if version
|
125
125
|
command.push("-Source #{new_resource.source}") if new_resource.source && cmdlet_name =~ Regexp.union(/Install-Package/, /Find-Package/)
|
126
126
|
command.push("-SkipPublisherCheck") if new_resource.skip_publisher_check && cmdlet_name !~ /Find-Package/
|
127
|
+
if new_resource.options && cmdlet_name !~ Regexp.union(/Get-Package/, /Find-Package/)
|
128
|
+
new_resource.options.each do |arg|
|
129
|
+
command.push(arg) unless command.include?(arg)
|
130
|
+
end
|
131
|
+
end
|
127
132
|
command.push(").Version")
|
128
133
|
command.join(" ")
|
129
134
|
end
|
data/lib/chef/providers.rb
CHANGED
@@ -74,6 +74,7 @@ require_relative "provider/package/cab"
|
|
74
74
|
require_relative "provider/package/powershell"
|
75
75
|
require_relative "provider/package/msu"
|
76
76
|
require_relative "provider/package/snap"
|
77
|
+
require_relative "provider/package/habitat"
|
77
78
|
|
78
79
|
require_relative "provider/service/arch"
|
79
80
|
require_relative "provider/service/freebsd"
|
@@ -29,7 +29,7 @@ class Chef
|
|
29
29
|
examples <<~DOC
|
30
30
|
**Bare minimum #{ChefUtils::Dist::Infra::PRODUCT} client.rb**:
|
31
31
|
|
32
|
-
The absolute minimum configuration necessary for a node to communicate with the
|
32
|
+
The absolute minimum configuration necessary for a node to communicate with the #{ChefUtils::Dist::Server::PRODUCT} is the URL of the #{ChefUtils::Dist::Server::PRODUCT}. All other configuration options either have values at the server side (Policyfiles, Roles, Environments, etc) or have default values determined at client startup.
|
33
33
|
|
34
34
|
```ruby
|
35
35
|
chef_client_config 'Create client.rb' do
|
@@ -184,6 +184,10 @@ class Chef
|
|
184
184
|
coerce: proc { |x| x.map { |v| string_to_symbol(v).capitalize } },
|
185
185
|
default: []
|
186
186
|
|
187
|
+
property :policy_persist_run_list, [true, false],
|
188
|
+
description: "Override run lists defined in a Policyfile with the `run_list` defined on the #{ChefUtils::Dist::Server::PRODUCT}.",
|
189
|
+
introduced: "17.3"
|
190
|
+
|
187
191
|
property :minimal_ohai, [true, false],
|
188
192
|
description: "Run a minimal set of Ohai plugins providing data necessary for the execution of #{ChefUtils::Dist::Infra::PRODUCT}'s built-in resources. Setting this to true will skip many large and time consuming data sets such as `cloud` or `packages`. Setting this this to true may break cookbooks that assume all Ohai data will be present."
|
189
193
|
|
@@ -277,7 +281,8 @@ class Chef
|
|
277
281
|
report_handlers: format_handler(new_resource.report_handlers),
|
278
282
|
ssl_verify_mode: new_resource.ssl_verify_mode,
|
279
283
|
start_handlers: format_handler(new_resource.start_handlers),
|
280
|
-
additional_config: new_resource.additional_config
|
284
|
+
additional_config: new_resource.additional_config,
|
285
|
+
policy_persist_run_list: new_resource.policy_persist_run_list
|
281
286
|
)
|
282
287
|
mode "0640"
|
283
288
|
action :create
|
@@ -106,7 +106,7 @@ class Chef
|
|
106
106
|
description: "The e-mail address to e-mail any cron task failures to."
|
107
107
|
|
108
108
|
property :accept_chef_license, [true, false],
|
109
|
-
description: "Accept the Chef Online Master License and Services Agreement. See <https://www.chef.io/online-master-agreement
|
109
|
+
description: "Accept the Chef Online Master License and Services Agreement. See <https://www.chef.io/online-master-agreement>",
|
110
110
|
default: false
|
111
111
|
|
112
112
|
property :config_directory, String,
|
@@ -65,7 +65,7 @@ class Chef
|
|
65
65
|
description: "A random number of seconds between 0 and X to add to interval so that all #{ChefUtils::Dist::Infra::CLIENT} commands don't execute at the same time."
|
66
66
|
|
67
67
|
property :accept_chef_license, [true, false],
|
68
|
-
description: "Accept the Chef Online Master License and Services Agreement. See <https://www.chef.io/online-master-agreement
|
68
|
+
description: "Accept the Chef Online Master License and Services Agreement. See <https://www.chef.io/online-master-agreement>",
|
69
69
|
default: false
|
70
70
|
|
71
71
|
property :config_directory, String,
|
@@ -87,7 +87,7 @@ class Chef
|
|
87
87
|
default_description: "30 if frequency is 'minute', 1 otherwise"
|
88
88
|
|
89
89
|
property :accept_chef_license, [true, false],
|
90
|
-
description: "Accept the Chef Online Master License and Services Agreement. See <https://www.chef.io/online-master-agreement
|
90
|
+
description: "Accept the Chef Online Master License and Services Agreement. See <https://www.chef.io/online-master-agreement>",
|
91
91
|
default: false
|
92
92
|
|
93
93
|
property :start_date, String,
|
@@ -75,7 +75,7 @@ class Chef
|
|
75
75
|
default: "5min"
|
76
76
|
|
77
77
|
property :accept_chef_license, [true, false],
|
78
|
-
description: "Accept the Chef Online Master License and Services Agreement. See <https://www.chef.io/online-master-agreement
|
78
|
+
description: "Accept the Chef Online Master License and Services Agreement. See <https://www.chef.io/online-master-agreement>",
|
79
79
|
default: false
|
80
80
|
|
81
81
|
property :run_on_battery, [true, false],
|
@@ -64,7 +64,7 @@ class Chef
|
|
64
64
|
property :certificate, String, required: [:add],
|
65
65
|
description: "The text of the certificate file including the BEGIN/END comment lines."
|
66
66
|
|
67
|
-
action :add do
|
67
|
+
action :add, description: "Add a trusted certificate to #{ChefUtils::Dist::Infra::PRODUCT}'s trusted certificate directory" do
|
68
68
|
unless ::Dir.exist?(Chef::Config[:trusted_certs_dir])
|
69
69
|
directory Chef::Config[:trusted_certs_dir] do
|
70
70
|
mode "0640"
|
@@ -78,7 +78,7 @@ class Chef
|
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
81
|
-
action :remove do
|
81
|
+
action :remove, description: "Remove a trusted certificate from #{ChefUtils::Dist::Infra::PRODUCT}'s trusted certificate directory" do
|
82
82
|
file cert_path do
|
83
83
|
action :delete
|
84
84
|
end
|
@@ -33,7 +33,7 @@ class Chef
|
|
33
33
|
```ruby
|
34
34
|
chef_vault_secret 'foo' do
|
35
35
|
data_bag 'bar'
|
36
|
-
raw_data({'auth' => 'baz'})
|
36
|
+
raw_data({ 'auth' => 'baz' })
|
37
37
|
admins 'jtimberman'
|
38
38
|
search '*:*'
|
39
39
|
end
|
@@ -45,7 +45,7 @@ class Chef
|
|
45
45
|
chef_vault_secret 'root-password' do
|
46
46
|
admins 'jtimberman,paulmooring'
|
47
47
|
data_bag 'secrets'
|
48
|
-
raw_data({'auth' => 'DoNotUseThisPasswordForRoot'})
|
48
|
+
raw_data({ 'auth' => 'DoNotUseThisPasswordForRoot' })
|
49
49
|
search '*:*'
|
50
50
|
end
|
51
51
|
```
|
@@ -74,7 +74,7 @@ class Chef
|
|
74
74
|
|
75
75
|
property :module_version, String,
|
76
76
|
introduced: "12.21",
|
77
|
-
description: "The version number of the module to use. PowerShell 5.0.10018.0 (or higher) supports having multiple versions of a module installed. This should be specified along with the module_name."
|
77
|
+
description: "The version number of the module to use. PowerShell 5.0.10018.0 (or higher) supports having multiple versions of a module installed. This should be specified along with the `module_name` property."
|
78
78
|
|
79
79
|
def property(property_name, value = nil)
|
80
80
|
unless property_name.is_a?(Symbol)
|
@@ -304,9 +304,9 @@ class Chef
|
|
304
304
|
gives a recipe full control over the command issued in a much cleaner, more
|
305
305
|
direct manner.
|
306
306
|
|
307
|
-
**Use the search
|
307
|
+
**Use the search Infra Language helper to find users**:
|
308
308
|
|
309
|
-
The following example shows how to use the `search` method in the
|
309
|
+
The following example shows how to use the `search` method in the Chef Infra Language to
|
310
310
|
search for users:
|
311
311
|
|
312
312
|
```ruby
|
@@ -515,7 +515,7 @@ class Chef
|
|
515
515
|
|
516
516
|
property :command, [ String, Array ],
|
517
517
|
name_property: true,
|
518
|
-
description: "An optional property to set the command to be executed if it differs from the resource block's name."
|
518
|
+
description: "An optional property to set the command to be executed if it differs from the resource block's name. Note: Use the **execute** resource to run a single command. Use multiple **execute** resource blocks to run multiple commands."
|
519
519
|
|
520
520
|
property :umask, [ String, Integer ],
|
521
521
|
description: "The file mode creation mask, or umask."
|
@@ -83,7 +83,8 @@ class Chef
|
|
83
83
|
|
84
84
|
property :clear_sources, [ TrueClass, FalseClass, nil ],
|
85
85
|
description: "Set to `true` to download a gem from the path specified by the `source` property (and not from RubyGems).",
|
86
|
-
default: lazy { Chef::Config[:clear_gem_sources] },
|
86
|
+
default: lazy { Chef::Config[:clear_gem_sources] },
|
87
|
+
default_description: "false unless `clear_gem_sources` set to true in the `client.rb` config.", desired_state: false
|
87
88
|
|
88
89
|
property :gem_binary, String, desired_state: false,
|
89
90
|
description: "The path of a gem binary to use for the installation. By default, the same version of Ruby that is used by #{ChefUtils::Dist::Infra::PRODUCT} will be used."
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: Chef Software, Inc.
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# li
|
16
|
+
|
17
|
+
def hab(*command)
|
18
|
+
# Windows shell_out does not support arrays, so manually cleaning and joining
|
19
|
+
hab_cmd = if windows?
|
20
|
+
(["hab"] + command).flatten.compact.join(" ")
|
21
|
+
else
|
22
|
+
(["hab"] + command)
|
23
|
+
end
|
24
|
+
shell_out!(hab_cmd)
|
25
|
+
rescue Errno::ENOENT
|
26
|
+
Chef::Log.fatal("'hab' binary not found, use the 'habitat_install' resource to install it first")
|
27
|
+
raise
|
28
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: Chef Software Inc.
|
3
|
+
#
|
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_relative "../package"
|
20
|
+
|
21
|
+
class Chef
|
22
|
+
class Resource
|
23
|
+
class HabitatPackage < Chef::Resource::Package
|
24
|
+
unified_mode true
|
25
|
+
|
26
|
+
provides :habitat_package
|
27
|
+
use "habitat_shared"
|
28
|
+
description "Use the **habitat_package** to install or remove Chef Habitat packages from Habitat Builder."
|
29
|
+
introduced "17.3"
|
30
|
+
examples <<~DOC
|
31
|
+
**Install core/redis**
|
32
|
+
|
33
|
+
```ruby
|
34
|
+
habitat_package 'core/redis'
|
35
|
+
```
|
36
|
+
|
37
|
+
**Install specific version of a package from the unstable channel**
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
habitat_package 'core/redis' do
|
41
|
+
version '3.2.3'
|
42
|
+
channel 'unstable'
|
43
|
+
end
|
44
|
+
```
|
45
|
+
|
46
|
+
**Install a package with specific version and revision**
|
47
|
+
|
48
|
+
```ruby
|
49
|
+
habitat_package 'core/redis' do
|
50
|
+
version '3.2.3/20160920131015'
|
51
|
+
end
|
52
|
+
```
|
53
|
+
|
54
|
+
**Install a package and force linking it's binary files to the system path**
|
55
|
+
|
56
|
+
```ruby
|
57
|
+
habitat_package 'core/nginx' do
|
58
|
+
binlink :force
|
59
|
+
end
|
60
|
+
```
|
61
|
+
|
62
|
+
**Install a package and link it's binary files to the system path**
|
63
|
+
|
64
|
+
```ruby
|
65
|
+
habitat_package 'core/nginx' do
|
66
|
+
options '--binlink'
|
67
|
+
end
|
68
|
+
```
|
69
|
+
|
70
|
+
**Remove package and all of it's versions**
|
71
|
+
|
72
|
+
```ruby
|
73
|
+
habitat_package 'core/nginx'
|
74
|
+
action :remove
|
75
|
+
end
|
76
|
+
```
|
77
|
+
|
78
|
+
**Remove specified version of a package**
|
79
|
+
|
80
|
+
```ruby
|
81
|
+
habitat_package 'core/nginx/3.2.3'
|
82
|
+
action :remove
|
83
|
+
end
|
84
|
+
```
|
85
|
+
|
86
|
+
**Remove package but retain some versions Note: Only available as of Habitat 1.5.86**
|
87
|
+
|
88
|
+
```ruby
|
89
|
+
habitat_package 'core/nginx'
|
90
|
+
keep_latest '2'
|
91
|
+
action :remove
|
92
|
+
end
|
93
|
+
```
|
94
|
+
|
95
|
+
```ruby
|
96
|
+
**Remove package but keep dependencies**
|
97
|
+
habitat_package 'core/nginx'
|
98
|
+
no_deps false
|
99
|
+
action :remove
|
100
|
+
end
|
101
|
+
```
|
102
|
+
DOC
|
103
|
+
|
104
|
+
property :bldr_url, String, default: "https://bldr.habitat.sh",
|
105
|
+
description: "The habitat builder url where packages will be downloaded from. **Defaults to public Habitat Builder**"
|
106
|
+
|
107
|
+
property :channel, String, default: "stable",
|
108
|
+
description: "The release channel to install your package from."
|
109
|
+
|
110
|
+
property :auth_token, String,
|
111
|
+
description: "Auth token for installing a package from a private organization on Habitat builder."
|
112
|
+
|
113
|
+
property :binlink, [true, false, :force], default: false,
|
114
|
+
description: "If habitat should attempt to binlink the package. Acceptable values: `true`, `false`, `:force`. Will fail on binlinking if set to `true` and binary or binlink exists."
|
115
|
+
|
116
|
+
property :options, String,
|
117
|
+
description: "Pass any additional parameters to the habitat package command."
|
118
|
+
|
119
|
+
property :keep_latest, String,
|
120
|
+
description: "Ability to uninstall while retaining a specified version **This feature only works in Habitat 1.5.86+.**"
|
121
|
+
|
122
|
+
property :exclude, String,
|
123
|
+
description: "Identifier of one or more packages that should not be uninstalled. (ex: core/redis, core/busybox-static/1.42.2/21120102031201)"
|
124
|
+
|
125
|
+
property :no_deps, [true, false], default: false,
|
126
|
+
description: "Remove package but retain dependencies."
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|