chef-apply 0.4.13 → 0.6.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.
- checksums.yaml +4 -4
- data/Gemfile +2 -8
- data/Rakefile +0 -7
- data/bin/chef-run +1 -1
- data/chef-apply.gemspec +9 -14
- data/i18n/en.yml +3 -2
- data/i18n/errors/en.yml +14 -6
- data/lib/chef_apply/action/base.rb +1 -1
- data/lib/chef_apply/action/converge_target.rb +5 -5
- data/lib/chef_apply/action/converge_target/ccr_failure_mapper.rb +1 -1
- data/lib/chef_apply/action/generate_local_policy.rb +3 -2
- data/lib/chef_apply/action/generate_temp_cookbook.rb +4 -4
- data/lib/chef_apply/action/generate_temp_cookbook/recipe_lookup.rb +5 -5
- data/lib/chef_apply/action/generate_temp_cookbook/temp_cookbook.rb +6 -6
- data/lib/chef_apply/action/install_chef.rb +10 -4
- data/lib/chef_apply/action/install_chef/minimum_chef_version.rb +6 -2
- data/lib/chef_apply/cli.rb +22 -22
- data/lib/chef_apply/cli/help.rb +1 -1
- data/lib/chef_apply/cli/options.rb +3 -3
- data/lib/chef_apply/cli/validation.rb +3 -1
- data/lib/chef_apply/config.rb +6 -6
- data/lib/chef_apply/errors/standard_error_resolver.rb +2 -2
- data/lib/chef_apply/file_fetcher.rb +4 -4
- data/lib/chef_apply/startup.rb +14 -12
- data/lib/chef_apply/target_host.rb +12 -5
- data/lib/chef_apply/target_host/macos.rb +69 -0
- data/lib/chef_apply/target_resolver.rb +2 -2
- data/lib/chef_apply/telemeter.rb +5 -1
- data/lib/chef_apply/text.rb +2 -2
- data/lib/chef_apply/ui/error_printer.rb +6 -6
- data/lib/chef_apply/ui/plain_text_header.rb +1 -2
- data/lib/chef_apply/ui/terminal.rb +5 -5
- data/lib/chef_apply/version.rb +1 -1
- metadata +14 -27
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b787c2d47fe3b153a3c8e46613bb62f13b6346a8efad7ae1efe8ece667b3c53c
|
|
4
|
+
data.tar.gz: 398bd9ad985fff7b688ce12983c195daadd93048f226834a7463f141c5f71675
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c70ecbd0e62ae60c3fc6e7d9e19e72f44aefa5325f83218f495e6cd42abc5bc7809b76b1a1bf2c06f47375be2f85ad0e4d7bd51a637c6210cc87b9237864e0d7
|
|
7
|
+
data.tar.gz: 6564f0e408919ac1ae2b1e611feeb9bd7517117d1a3a2e33240a973ec3bca0ea4577650e2b0c20fc7ae71229965fad38879b1429425bf9ff84f48f0ee16ea5ec
|
data/Gemfile
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#
|
|
2
|
-
# Copyright:: Copyright (c)
|
|
2
|
+
# Copyright:: Copyright (c) Chef Software Inc.
|
|
3
3
|
# License:: Apache License, Version 2.0
|
|
4
4
|
#
|
|
5
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -19,18 +19,12 @@ source "https://rubygems.org"
|
|
|
19
19
|
gemspec
|
|
20
20
|
|
|
21
21
|
group :development do
|
|
22
|
-
gem "chefstyle"
|
|
22
|
+
gem "chefstyle", "1.7.4"
|
|
23
23
|
gem "rake", ">= 10.1.0"
|
|
24
24
|
gem "rspec", "~> 3.0"
|
|
25
25
|
gem "simplecov"
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
group :docs do
|
|
29
|
-
gem "yard"
|
|
30
|
-
gem "redcarpet"
|
|
31
|
-
gem "github-markup"
|
|
32
|
-
end
|
|
33
|
-
|
|
34
28
|
group :debug do
|
|
35
29
|
gem "pry"
|
|
36
30
|
gem "pry-byebug"
|
data/Rakefile
CHANGED
|
@@ -24,13 +24,6 @@ rescue LoadError
|
|
|
24
24
|
puts "chefstyle gem is not installed. bundle install first to make sure all dependencies are installed."
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
-
begin
|
|
28
|
-
require "yard"
|
|
29
|
-
YARD::Rake::YardocTask.new(:docs)
|
|
30
|
-
rescue LoadError
|
|
31
|
-
puts "yard is not available. bundle install first to make sure all dependencies are installed."
|
|
32
|
-
end
|
|
33
|
-
|
|
34
27
|
task :console do
|
|
35
28
|
require "irb"
|
|
36
29
|
require "irb/completion"
|
data/bin/chef-run
CHANGED
data/chef-apply.gemspec
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
# limitations under the License.
|
|
16
16
|
#
|
|
17
17
|
|
|
18
|
-
lib = File.expand_path("
|
|
18
|
+
lib = File.expand_path("lib", __dir__)
|
|
19
19
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
20
20
|
require "chef_apply/version"
|
|
21
21
|
|
|
@@ -29,7 +29,7 @@ Gem::Specification.new do |spec|
|
|
|
29
29
|
spec.description = "Ad-hoc management of individual nodes and devices."
|
|
30
30
|
spec.homepage = "https://github.com/chef/chef-apply"
|
|
31
31
|
spec.license = "Apache-2.0"
|
|
32
|
-
spec.required_ruby_version = ">= 2.
|
|
32
|
+
spec.required_ruby_version = ">= 2.6"
|
|
33
33
|
|
|
34
34
|
spec.files = %w{Rakefile LICENSE warning.txt} +
|
|
35
35
|
Dir.glob("Gemfile*") + # Includes Gemfile and locks
|
|
@@ -40,24 +40,19 @@ Gem::Specification.new do |spec|
|
|
|
40
40
|
spec.require_paths = ["lib"]
|
|
41
41
|
|
|
42
42
|
spec.add_dependency "mixlib-cli" # Provides argument handling DSL for CLI applications
|
|
43
|
-
spec.add_dependency "mixlib-config", ">= 3.0.5"
|
|
44
|
-
# simplifies managing a configuration file
|
|
43
|
+
spec.add_dependency "mixlib-config", ">= 3.0.5" # shared chef configuration library that simplifies managing a configuration file
|
|
45
44
|
spec.add_dependency "mixlib-log" # Basis for our traditional logger
|
|
46
45
|
spec.add_dependency "mixlib-install" # URL resolver + install tool for chef products
|
|
47
|
-
spec.add_dependency "r18n-desktop" # easy path to message text management via
|
|
48
|
-
|
|
49
|
-
spec.add_dependency "toml-rb" # This isn't ideal because mixlib-config uses 'tomlrb'
|
|
50
|
-
# but that library does not support a dumper
|
|
46
|
+
spec.add_dependency "r18n-desktop" # easy path to message text management via localization gem...
|
|
47
|
+
spec.add_dependency "toml-rb" # This isn't ideal because mixlib-config uses 'tomlrb' but that library does not support a dumper
|
|
51
48
|
spec.add_dependency "train-core", "~> 3.0" # remote connection management over ssh, winrm
|
|
52
49
|
spec.add_dependency "train-winrm" # winrm transports were pulled out into this plugin
|
|
53
50
|
spec.add_dependency "pastel" # A color library
|
|
54
51
|
spec.add_dependency "tty-spinner" # Pretty output for status updates in the CLI
|
|
55
|
-
spec.add_dependency "chef", ">=
|
|
56
|
-
spec.add_dependency "chef-cli", ">=
|
|
52
|
+
spec.add_dependency "chef", ">= 16.0" # Needed to load cookbooks
|
|
53
|
+
spec.add_dependency "chef-cli", ">= 2.0.10 " # Policyfile
|
|
57
54
|
spec.add_dependency "chef-telemetry", ">= 1.0.2"
|
|
58
|
-
spec.add_dependency "license-acceptance", "
|
|
55
|
+
spec.add_dependency "license-acceptance", ">= 1.0.11", "< 3"
|
|
59
56
|
|
|
60
|
-
spec.
|
|
61
|
-
|
|
62
|
-
spec.post_install_message = File.read(File.expand_path("../warning.txt", __FILE__))
|
|
57
|
+
spec.post_install_message = File.read(File.expand_path("warning.txt", __dir__))
|
|
63
58
|
end
|
data/i18n/en.yml
CHANGED
|
@@ -25,10 +25,10 @@ cli:
|
|
|
25
25
|
%1:
|
|
26
26
|
|
|
27
27
|
[telemetry]
|
|
28
|
-
|
|
28
|
+
enabled=false
|
|
29
29
|
|
|
30
30
|
For more information about what we data gather and additional opt-out
|
|
31
|
-
options, visit https://chef.
|
|
31
|
+
options, visit https://docs.chef.io/workstation/privacy/
|
|
32
32
|
|
|
33
33
|
description: |
|
|
34
34
|
Chef Run is a tool to execute ad-hoc tasks using Chef.
|
|
@@ -113,6 +113,7 @@ cli:
|
|
|
113
113
|
cookbook is found we run the default recipe.
|
|
114
114
|
3. This behaves similarly to 'cookbook name' above, but it also allows
|
|
115
115
|
you to specify which recipe to use from the cookbook.
|
|
116
|
+
Usage: cookbookname::recipename
|
|
116
117
|
error:
|
|
117
118
|
bad_config_file: |
|
|
118
119
|
|
data/i18n/errors/en.yml
CHANGED
|
@@ -146,7 +146,7 @@ errors:
|
|
|
146
146
|
For more information, please consult the documentation
|
|
147
147
|
for this resource:
|
|
148
148
|
|
|
149
|
-
https://docs.chef.io/
|
|
149
|
+
https://docs.chef.io/resources/
|
|
150
150
|
|
|
151
151
|
CHEFCCR004:
|
|
152
152
|
text: |
|
|
@@ -157,7 +157,7 @@ errors:
|
|
|
157
157
|
Please consult the documentation for properties
|
|
158
158
|
supported by your resource and their valid values:
|
|
159
159
|
|
|
160
|
-
https://docs.chef.io/
|
|
160
|
+
https://docs.chef.io/resources/
|
|
161
161
|
|
|
162
162
|
CHEFCCR005:
|
|
163
163
|
text: |
|
|
@@ -165,7 +165,7 @@ errors:
|
|
|
165
165
|
|
|
166
166
|
Please consult the documentation for a list of valid resources:
|
|
167
167
|
|
|
168
|
-
https://docs.chef.io/
|
|
168
|
+
https://docs.chef.io/resources/
|
|
169
169
|
|
|
170
170
|
CHEFCCR006:
|
|
171
171
|
text: |
|
|
@@ -174,7 +174,7 @@ errors:
|
|
|
174
174
|
Please consult the documentation for %2 for a list of
|
|
175
175
|
valid properties:
|
|
176
176
|
|
|
177
|
-
https://docs.chef.io/
|
|
177
|
+
https://docs.chef.io/resources/
|
|
178
178
|
|
|
179
179
|
CHEFCCR099:
|
|
180
180
|
text: |
|
|
@@ -246,7 +246,7 @@ errors:
|
|
|
246
246
|
|
|
247
247
|
Additional instructions can be found in the troubleshooting documentation:
|
|
248
248
|
|
|
249
|
-
https://
|
|
249
|
+
https://docs.chef.io/workstation/troubleshooting/#cheftrn007
|
|
250
250
|
|
|
251
251
|
CHEFTRN999:
|
|
252
252
|
text: |
|
|
@@ -257,6 +257,14 @@ errors:
|
|
|
257
257
|
%1
|
|
258
258
|
|
|
259
259
|
# CLI argument validation errors
|
|
260
|
+
#
|
|
261
|
+
CHEFVAL001:
|
|
262
|
+
display: { decorations: false }
|
|
263
|
+
text: |
|
|
264
|
+
The key file you specified does not exist or can't be read.
|
|
265
|
+
|
|
266
|
+
You provided '%1'.
|
|
267
|
+
|
|
260
268
|
CHEFVAL002:
|
|
261
269
|
display: { decorations: false }
|
|
262
270
|
text: |
|
|
@@ -311,7 +319,7 @@ errors:
|
|
|
311
319
|
CHEFVAL009:
|
|
312
320
|
display: { decorations: false }
|
|
313
321
|
text: |
|
|
314
|
-
File extension '%1' is unsupported. Currently recipes must be specified with a `.rb` extension.
|
|
322
|
+
File extension '%1' is unsupported. Currently recipes must be specified with a `.rb` or `.yml` extension.
|
|
315
323
|
|
|
316
324
|
CHEFVAL010:
|
|
317
325
|
display: { decorations: false }
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
# limitations under the License.
|
|
16
16
|
#
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
require "pathname"
|
|
20
|
-
require "tempfile"
|
|
18
|
+
require_relative "base"
|
|
19
|
+
require "pathname" unless defined?(Pathname)
|
|
20
|
+
require "tempfile" unless defined?(Tempfile)
|
|
21
21
|
# FLAG: require "chef/util/path_helper"
|
|
22
22
|
require "chef/util/path_helper"
|
|
23
23
|
|
|
@@ -159,7 +159,7 @@ module ChefApply::Action
|
|
|
159
159
|
end
|
|
160
160
|
|
|
161
161
|
def handle_ccr_error
|
|
162
|
-
|
|
162
|
+
require_relative "converge_target/ccr_failure_mapper"
|
|
163
163
|
mapper_opts = {}
|
|
164
164
|
content = target_host.fetch_file_contents(chef_report_path)
|
|
165
165
|
if content.nil?
|
|
@@ -198,7 +198,7 @@ module ChefApply::Action
|
|
|
198
198
|
else
|
|
199
199
|
# cd is shell a builtin, so we'll invoke bash. This also means all commands are executed
|
|
200
200
|
# with sudo (as long as we are hardcoding our sudo use)
|
|
201
|
-
"bash -c 'cd #{working_dir}; chef-client -z --config #{File.join(working_dir, config_file)} --recipe-url #{File.join(working_dir, policy)}'"
|
|
201
|
+
"bash -c 'cd #{working_dir}; /opt/chef/bin/chef-client -z --config #{File.join(working_dir, config_file)} --recipe-url #{File.join(working_dir, policy)}'"
|
|
202
202
|
end
|
|
203
203
|
end
|
|
204
204
|
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
# limitations under the License.
|
|
16
16
|
#
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
require_relative "base"
|
|
19
|
+
require_relative "../error"
|
|
20
20
|
module ChefApply::Action
|
|
21
21
|
class GenerateLocalPolicy < Base
|
|
22
22
|
attr_reader :archive_file_location
|
|
@@ -53,6 +53,7 @@ module ChefApply::Action
|
|
|
53
53
|
end
|
|
54
54
|
|
|
55
55
|
end
|
|
56
|
+
|
|
56
57
|
class PolicyfileInstallError < ChefApply::Error
|
|
57
58
|
def initialize(cause_err); super("CHEFPOLICY001", cause_err.message); end
|
|
58
59
|
end
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
# See the License for the specific language governing permissions and
|
|
15
15
|
# limitations under the License.
|
|
16
16
|
#
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
require_relative "base"
|
|
18
|
+
require_relative "../error"
|
|
19
19
|
module ChefApply
|
|
20
20
|
module Action
|
|
21
21
|
class GenerateTempCookbook < Base
|
|
@@ -35,7 +35,7 @@ module ChefApply
|
|
|
35
35
|
|
|
36
36
|
def initialize(options)
|
|
37
37
|
super(options)
|
|
38
|
-
|
|
38
|
+
require_relative "generate_temp_cookbook/temp_cookbook"
|
|
39
39
|
@generated_cookbook ||= TempCookbook.new
|
|
40
40
|
end
|
|
41
41
|
|
|
@@ -59,7 +59,7 @@ module ChefApply
|
|
|
59
59
|
ChefApply::Log.debug("#{recipe_specifier} is a valid path to a recipe")
|
|
60
60
|
recipe_path = recipe_specifier
|
|
61
61
|
else
|
|
62
|
-
|
|
62
|
+
require_relative "generate_temp_cookbook/recipe_lookup"
|
|
63
63
|
rl = RecipeLookup.new(repo_paths)
|
|
64
64
|
cookbook_path_or_name, optional_recipe_name = rl.split(recipe_specifier)
|
|
65
65
|
cookbook = rl.load_cookbook(cookbook_path_or_name)
|
|
@@ -16,10 +16,10 @@
|
|
|
16
16
|
#
|
|
17
17
|
|
|
18
18
|
require "chef-config/config"
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
require_relative "../../config"
|
|
20
|
+
require_relative "../../error"
|
|
21
|
+
require_relative "../../log"
|
|
22
|
+
require_relative "../base"
|
|
23
23
|
|
|
24
24
|
module ChefApply
|
|
25
25
|
module Action
|
|
@@ -81,7 +81,7 @@ module ChefApply
|
|
|
81
81
|
# Find the specified recipe or default recipe if none is specified.
|
|
82
82
|
# Raise an error if recipe cannot be found.
|
|
83
83
|
def find_recipe(cookbook, recipe_name = nil)
|
|
84
|
-
recipes = cookbook.recipe_filenames_by_name
|
|
84
|
+
recipes = cookbook.recipe_filenames_by_name.merge(cookbook.recipe_yml_filenames_by_name)
|
|
85
85
|
if recipe_name.nil?
|
|
86
86
|
default_recipe = recipes["default"]
|
|
87
87
|
raise NoDefaultRecipe.new(cookbook.root_dir, cookbook.name) if default_recipe.nil?
|
|
@@ -15,11 +15,11 @@
|
|
|
15
15
|
# limitations under the License.
|
|
16
16
|
#
|
|
17
17
|
|
|
18
|
-
require "tmpdir"
|
|
19
|
-
require "fileutils"
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
require "tmpdir" unless defined?(Dir.mktmpdir)
|
|
19
|
+
require "fileutils" unless defined?(FileUtils)
|
|
20
|
+
require_relative "../../log"
|
|
21
|
+
require_relative "../../error"
|
|
22
|
+
require_relative "../generate_temp_cookbook"
|
|
23
23
|
module ChefApply
|
|
24
24
|
module Action
|
|
25
25
|
class GenerateTempCookbook
|
|
@@ -34,7 +34,7 @@ module ChefApply
|
|
|
34
34
|
|
|
35
35
|
def from_existing_recipe(existing_recipe_path)
|
|
36
36
|
ext_name = File.extname(existing_recipe_path)
|
|
37
|
-
raise UnsupportedExtension.new(ext_name) unless ext_name == ".rb"
|
|
37
|
+
raise UnsupportedExtension.new(ext_name) unless ext_name == ".rb" || ext_name == ".yml"
|
|
38
38
|
|
|
39
39
|
cb = cookbook_for_recipe(existing_recipe_path)
|
|
40
40
|
if cb
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
# limitations under the License.
|
|
16
16
|
#
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
require "fileutils"
|
|
18
|
+
require_relative "base"
|
|
19
|
+
require_relative "install_chef/minimum_chef_version"
|
|
20
|
+
require "fileutils" unless defined?(FileUtils)
|
|
21
21
|
|
|
22
22
|
module ChefApply
|
|
23
23
|
module Action
|
|
@@ -86,6 +86,12 @@ module ChefApply
|
|
|
86
86
|
platform_version_compatibility_mode: true,
|
|
87
87
|
}
|
|
88
88
|
case platform.name
|
|
89
|
+
when /mac_os_x/
|
|
90
|
+
if platform.release.to_i >= 17
|
|
91
|
+
opts[:platform_version] = "10.13"
|
|
92
|
+
else
|
|
93
|
+
raise NotImplementedError
|
|
94
|
+
end
|
|
89
95
|
when /windows/
|
|
90
96
|
opts[:platform] = "windows"
|
|
91
97
|
when "redhat", "centos"
|
|
@@ -104,7 +110,7 @@ module ChefApply
|
|
|
104
110
|
end
|
|
105
111
|
|
|
106
112
|
def download_to_workstation(url_path)
|
|
107
|
-
|
|
113
|
+
require_relative "../file_fetcher"
|
|
108
114
|
ChefApply::FileFetcher.fetch(url_path)
|
|
109
115
|
end
|
|
110
116
|
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
# limitations under the License.
|
|
16
16
|
#
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
require_relative "../../error"
|
|
19
|
+
require_relative "minimum_chef_version"
|
|
20
20
|
|
|
21
21
|
module ChefApply
|
|
22
22
|
module Action
|
|
@@ -32,6 +32,10 @@ module ChefApply
|
|
|
32
32
|
13 => Gem::Version.new("13.10.4"),
|
|
33
33
|
14 => Gem::Version.new("14.1.1"),
|
|
34
34
|
},
|
|
35
|
+
macos: {
|
|
36
|
+
13 => Gem::Version.new("13.10.4"),
|
|
37
|
+
14 => Gem::Version.new("14.1.1"),
|
|
38
|
+
},
|
|
35
39
|
}.freeze
|
|
36
40
|
|
|
37
41
|
def self.check!(target, check_only)
|
data/lib/chef_apply/cli.rb
CHANGED
|
@@ -15,29 +15,29 @@
|
|
|
15
15
|
# See the License for the specific language governing permissions and
|
|
16
16
|
# limitations under the License.
|
|
17
17
|
#
|
|
18
|
-
require "mixlib/cli"
|
|
18
|
+
require "mixlib/cli" unless defined?(Mixlib::CLI)
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
require_relative "config"
|
|
21
21
|
require "chef-config/config"
|
|
22
22
|
require "chef-config/logger"
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
24
|
+
require_relative "cli/validation"
|
|
25
|
+
require_relative "cli/options"
|
|
26
|
+
require_relative "cli/help"
|
|
27
|
+
require_relative "error"
|
|
28
|
+
require_relative "log"
|
|
29
|
+
require_relative "target_host"
|
|
30
|
+
require_relative "target_resolver"
|
|
31
|
+
require_relative "telemeter"
|
|
32
|
+
require_relative "ui/error_printer"
|
|
33
|
+
require_relative "ui/terminal"
|
|
34
|
+
require_relative "ui/terminal/job"
|
|
35
35
|
require "license_acceptance/cli_flags/mixlib_cli"
|
|
36
36
|
require "license_acceptance/acceptor"
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
require_relative "action/generate_temp_cookbook"
|
|
39
|
+
require_relative "action/generate_local_policy"
|
|
40
|
+
require_relative "action/converge_target"
|
|
41
41
|
|
|
42
42
|
module ChefApply
|
|
43
43
|
class CLI
|
|
@@ -63,14 +63,14 @@ module ChefApply
|
|
|
63
63
|
super()
|
|
64
64
|
end
|
|
65
65
|
|
|
66
|
-
def run
|
|
66
|
+
def run(enforce_license: false)
|
|
67
67
|
# Perform a timing and capture of the run. Individual methods and actions may perform
|
|
68
68
|
# nested Chef::Telemeter.timed_*_capture or Chef::Telemeter.capture calls in their operation, and
|
|
69
69
|
# they will be captured in the same telemetry session.
|
|
70
70
|
|
|
71
71
|
Chef::Telemeter.timed_run_capture([:redacted]) do
|
|
72
72
|
begin
|
|
73
|
-
perform_run
|
|
73
|
+
perform_run(enforce_license: enforce_license)
|
|
74
74
|
rescue Exception => e
|
|
75
75
|
@rc = handle_run_error(e)
|
|
76
76
|
end
|
|
@@ -100,14 +100,14 @@ module ChefApply
|
|
|
100
100
|
end
|
|
101
101
|
end
|
|
102
102
|
|
|
103
|
-
def perform_run
|
|
103
|
+
def perform_run(enforce_license: false)
|
|
104
104
|
parse_options(@argv)
|
|
105
105
|
if @argv.empty? || parsed_options[:help]
|
|
106
106
|
show_help
|
|
107
107
|
elsif parsed_options[:version]
|
|
108
108
|
show_version
|
|
109
109
|
else
|
|
110
|
-
check_license_acceptance
|
|
110
|
+
check_license_acceptance if enforce_license
|
|
111
111
|
validate_params(cli_arguments)
|
|
112
112
|
target_hosts = resolve_targets(cli_arguments.shift, parsed_options)
|
|
113
113
|
render_cookbook_setup(cli_arguments)
|
|
@@ -179,7 +179,7 @@ module ChefApply
|
|
|
179
179
|
end
|
|
180
180
|
|
|
181
181
|
def install(target_host, reporter)
|
|
182
|
-
|
|
182
|
+
require_relative "action/install_chef"
|
|
183
183
|
context = TS.install_chef
|
|
184
184
|
reporter.update(context.verifying)
|
|
185
185
|
installer = Action::InstallChef.new(target_host: target_host, check_only: !parsed_options[:install])
|
|
@@ -282,7 +282,7 @@ module ChefApply
|
|
|
282
282
|
end
|
|
283
283
|
|
|
284
284
|
def handle_perform_error(e)
|
|
285
|
-
|
|
285
|
+
require_relative "errors/standard_error_resolver"
|
|
286
286
|
id = e.respond_to?(:id) ? e.id : e.class.to_s
|
|
287
287
|
# TODO: This is currently sending host information for certain ssh errors
|
|
288
288
|
# post release we need to scrub this data. For now I'm redacting the
|
data/lib/chef_apply/cli/help.rb
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
# limitations under the License.
|
|
16
16
|
#
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
require_relative "../text"
|
|
19
19
|
|
|
20
20
|
# Moving the options into here so the cli.rb file is smaller and easier to read
|
|
21
21
|
# For options that need to be merged back into the global ChefApply::Config object
|
|
@@ -64,8 +64,8 @@ module ChefApply
|
|
|
64
64
|
description: T.identity_file,
|
|
65
65
|
proc: (Proc.new do |paths|
|
|
66
66
|
path = paths
|
|
67
|
-
unless File.
|
|
68
|
-
raise OptionValidationError.new("CHEFVAL001",
|
|
67
|
+
unless File.readable?(path)
|
|
68
|
+
raise OptionValidationError.new("CHEFVAL001", nil, path)
|
|
69
69
|
end
|
|
70
70
|
|
|
71
71
|
path
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
# limitations under the License.
|
|
16
16
|
#
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
require_relative "../error"
|
|
19
19
|
|
|
20
20
|
module ChefApply
|
|
21
21
|
class CLI
|
|
@@ -76,6 +76,8 @@ module ChefApply
|
|
|
76
76
|
value.to_i
|
|
77
77
|
when /^\d+\.\d*$/, /^\d*\.\d+$/
|
|
78
78
|
value.to_f
|
|
79
|
+
when /^[:].+$/
|
|
80
|
+
value.split(":").last.to_sym
|
|
79
81
|
when /true/i
|
|
80
82
|
true
|
|
81
83
|
when /false/i
|
data/lib/chef_apply/config.rb
CHANGED
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
# limitations under the License.
|
|
16
16
|
#
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
require "mixlib/config"
|
|
20
|
-
require "fileutils"
|
|
21
|
-
require "pathname"
|
|
18
|
+
require_relative "log"
|
|
19
|
+
require "mixlib/config" unless defined?(Mixlib::Config)
|
|
20
|
+
require "fileutils" unless defined?(FileUtils)
|
|
21
|
+
require "pathname" unless defined?(Pathname)
|
|
22
22
|
require "chef-config/config"
|
|
23
23
|
require "chef-config/workstation_config_loader"
|
|
24
24
|
|
|
@@ -109,8 +109,8 @@ module ChefApply
|
|
|
109
109
|
# in their local configuration to ensure that dev usage
|
|
110
110
|
# doesn't skew customer telemetry.
|
|
111
111
|
config_context :telemetry do
|
|
112
|
-
default(:
|
|
113
|
-
default(:
|
|
112
|
+
default(:dev_mode, false)
|
|
113
|
+
default(:enabled, true)
|
|
114
114
|
end
|
|
115
115
|
|
|
116
116
|
config_context :log do
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
# limitations under the License.
|
|
16
16
|
#
|
|
17
17
|
|
|
18
|
-
require "net/http"
|
|
19
|
-
require "uri"
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
require "net/http" unless defined?(Net::HTTP)
|
|
19
|
+
require "uri" unless defined?(URI)
|
|
20
|
+
require_relative "config"
|
|
21
|
+
require_relative "log"
|
|
22
22
|
|
|
23
23
|
module ChefApply
|
|
24
24
|
class FileFetcher
|
data/lib/chef_apply/startup.rb
CHANGED
|
@@ -14,10 +14,10 @@
|
|
|
14
14
|
# See the License for the specific language governing permissions and
|
|
15
15
|
# limitations under the License.
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
require_relative "config"
|
|
18
|
+
require_relative "text"
|
|
19
|
+
require_relative "ui/terminal"
|
|
20
|
+
require_relative "telemeter"
|
|
21
21
|
require "chef/log"
|
|
22
22
|
require "chef/config"
|
|
23
23
|
module ChefApply
|
|
@@ -33,7 +33,7 @@ module ChefApply
|
|
|
33
33
|
init_terminal
|
|
34
34
|
end
|
|
35
35
|
|
|
36
|
-
def run
|
|
36
|
+
def run(enforce_license: false)
|
|
37
37
|
# This component is not supported in ChefDK; an exception will be raised
|
|
38
38
|
# if running in that context.
|
|
39
39
|
verify_not_in_chefdk
|
|
@@ -62,7 +62,7 @@ module ChefApply
|
|
|
62
62
|
start_telemeter_upload
|
|
63
63
|
|
|
64
64
|
# Launch the actual Chef Apply behavior
|
|
65
|
-
start_chef_apply
|
|
65
|
+
start_chef_apply(enforce_license: enforce_license)
|
|
66
66
|
|
|
67
67
|
# NOTE: Because these exceptions occur outside of the
|
|
68
68
|
# CLI handling, they won't be tracked in telemtry.
|
|
@@ -119,7 +119,7 @@ module ChefApply
|
|
|
119
119
|
end
|
|
120
120
|
|
|
121
121
|
def setup_telemetry
|
|
122
|
-
require "securerandom"
|
|
122
|
+
require "securerandom" unless defined?(SecureRandom)
|
|
123
123
|
installation_id = SecureRandom.uuid
|
|
124
124
|
File.write(Config.telemetry_installation_identifier_file, installation_id)
|
|
125
125
|
|
|
@@ -132,7 +132,7 @@ module ChefApply
|
|
|
132
132
|
def start_telemeter_upload
|
|
133
133
|
cfg = {
|
|
134
134
|
enabled: Config.telemetry[:enabled],
|
|
135
|
-
|
|
135
|
+
dev_mode: Config.telemetry[:dev_mode],
|
|
136
136
|
payload_dir: Config.telemetry_path,
|
|
137
137
|
installation_identifier_file: Config.telemetry_installation_identifier_file,
|
|
138
138
|
session_file: Config.telemetry_session_file,
|
|
@@ -194,24 +194,26 @@ module ChefApply
|
|
|
194
194
|
Chef::Log.level = ChefApply::Log.level
|
|
195
195
|
end
|
|
196
196
|
|
|
197
|
-
def start_chef_apply
|
|
198
|
-
|
|
199
|
-
ChefApply::CLI.new(@argv).run
|
|
197
|
+
def start_chef_apply(enforce_license: false)
|
|
198
|
+
require_relative "cli"
|
|
199
|
+
ChefApply::CLI.new(@argv).run(enforce_license: enforce_license)
|
|
200
200
|
end
|
|
201
201
|
|
|
202
202
|
private
|
|
203
203
|
|
|
204
204
|
def script_path
|
|
205
|
-
|
|
205
|
+
__dir__
|
|
206
206
|
end
|
|
207
207
|
|
|
208
208
|
class ConfigPathNotProvided < StandardError; end
|
|
209
|
+
|
|
209
210
|
class ConfigPathInvalid < StandardError
|
|
210
211
|
attr_reader :path
|
|
211
212
|
def initialize(path)
|
|
212
213
|
@path = path
|
|
213
214
|
end
|
|
214
215
|
end
|
|
216
|
+
|
|
215
217
|
class UnsupportedInstallation < StandardError; end
|
|
216
218
|
end
|
|
217
219
|
end
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
# limitations under the License.
|
|
16
16
|
#
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
require_relative "log"
|
|
19
|
+
require_relative "error"
|
|
20
20
|
require "train"
|
|
21
21
|
|
|
22
22
|
module ChefApply
|
|
@@ -134,11 +134,14 @@ module ChefApply
|
|
|
134
134
|
def mix_in_target_platform!
|
|
135
135
|
case base_os
|
|
136
136
|
when :linux
|
|
137
|
-
|
|
137
|
+
require_relative "target_host/linux"
|
|
138
138
|
class << self; include ChefApply::TargetHost::Linux; end
|
|
139
139
|
when :windows
|
|
140
|
-
|
|
140
|
+
require_relative "target_host/windows"
|
|
141
141
|
class << self; include ChefApply::TargetHost::Windows; end
|
|
142
|
+
when :macos
|
|
143
|
+
require_relative "target_host/macos"
|
|
144
|
+
class << self; include ChefApply::TargetHost::MacOS; end
|
|
142
145
|
when :other
|
|
143
146
|
raise ChefApply::TargetHost::UnsupportedTargetOS.new(platform.name)
|
|
144
147
|
end
|
|
@@ -169,6 +172,8 @@ module ChefApply
|
|
|
169
172
|
:windows
|
|
170
173
|
elsif platform.linux?
|
|
171
174
|
:linux
|
|
175
|
+
elsif platform.darwin?
|
|
176
|
+
:macos
|
|
172
177
|
else
|
|
173
178
|
:other
|
|
174
179
|
end
|
|
@@ -280,7 +285,7 @@ module ChefApply
|
|
|
280
285
|
end
|
|
281
286
|
|
|
282
287
|
def ssh_config_for_host(host)
|
|
283
|
-
require "net/ssh"
|
|
288
|
+
require "net/ssh" unless defined?(Net::SSH)
|
|
284
289
|
Net::SSH::Config.for(host)
|
|
285
290
|
end
|
|
286
291
|
|
|
@@ -323,7 +328,9 @@ module ChefApply
|
|
|
323
328
|
super(*(Array(init_params).flatten))
|
|
324
329
|
end
|
|
325
330
|
end
|
|
331
|
+
|
|
326
332
|
class ChefNotInstalled < StandardError; end
|
|
333
|
+
|
|
327
334
|
class UnsupportedTargetOS < ChefApply::ErrorNoLogs
|
|
328
335
|
def initialize(os_name); super("CHEFTARG001", os_name); end
|
|
329
336
|
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright (c) 2017 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
|
+
# limitations under the License.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
module ChefApply
|
|
19
|
+
class TargetHost
|
|
20
|
+
module MacOS
|
|
21
|
+
def omnibus_manifest_path
|
|
22
|
+
# TODO - if habitat install on target, this won't work
|
|
23
|
+
# Note that we can't use File::Join, because that will render for the
|
|
24
|
+
# CURRENT platform - not the platform of the target.
|
|
25
|
+
"/opt/chef/version-manifest.json"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def mkdir(path)
|
|
29
|
+
run_command!("mkdir -p #{path}")
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def chown(path, owner)
|
|
33
|
+
owner ||= user
|
|
34
|
+
run_command!("chown #{owner} '#{path}'")
|
|
35
|
+
nil
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def install_package(remote_path)
|
|
39
|
+
install_cmd = <<-EOS
|
|
40
|
+
hdiutil detach "/Volumes/chef_software" >/dev/null 2>&1 || true
|
|
41
|
+
hdiutil attach #{remote_path} -mountpoint "/Volumes/chef_software"
|
|
42
|
+
cd / && sudo /usr/sbin/installer -pkg `sudo find "/Volumes/chef_software" -name \\*.pkg` -target /
|
|
43
|
+
EOS
|
|
44
|
+
run_command!(install_cmd)
|
|
45
|
+
nil
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def del_file(path)
|
|
49
|
+
run_command!("rm -rf #{path}")
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def del_dir(path)
|
|
53
|
+
del_file(path)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def make_temp_dir
|
|
57
|
+
installer_dir = "/tmp/chef-installer"
|
|
58
|
+
run_command!("mkdir -p #{installer_dir}")
|
|
59
|
+
run_command!("chmod 777 #{installer_dir}")
|
|
60
|
+
installer_dir
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def ws_cache_path
|
|
64
|
+
"/var/chef-workstation"
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
data/lib/chef_apply/telemeter.rb
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
require "chef/telemeter"
|
|
19
19
|
# Monkey patch the telemetry lib to respect our config.toml
|
|
20
20
|
# entry for telemetry.
|
|
21
|
-
|
|
21
|
+
require_relative "telemeter/patch"
|
|
22
22
|
module ChefApply
|
|
23
23
|
class Telemeter
|
|
24
24
|
def self.timed_action_capture(action, &block)
|
|
@@ -36,5 +36,9 @@ module ChefApply
|
|
|
36
36
|
end
|
|
37
37
|
Chef::Telemeter.timed_capture(:action, { action: action.name, target: target_data }, &block)
|
|
38
38
|
end
|
|
39
|
+
|
|
40
|
+
def self.capture(name, data = {}, options = {})
|
|
41
|
+
Chef::Telemeter.capture(name, data, options)
|
|
42
|
+
end
|
|
39
43
|
end
|
|
40
44
|
end
|
data/lib/chef_apply/text.rb
CHANGED
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
#
|
|
17
17
|
|
|
18
18
|
require "r18n-desktop"
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
require_relative "text/text_wrapper"
|
|
20
|
+
require_relative "text/error_translation"
|
|
21
21
|
|
|
22
22
|
# A very thin wrapper around R18n, the idea being that we're likely to replace r18n
|
|
23
23
|
# down the road and don't want to have to change all of our commands.
|
|
@@ -16,12 +16,12 @@
|
|
|
16
16
|
#
|
|
17
17
|
|
|
18
18
|
require "train/errors"
|
|
19
|
-
require "pastel"
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
require "pastel" unless defined?(Pastel)
|
|
20
|
+
require_relative "../error"
|
|
21
|
+
require_relative "../config"
|
|
22
|
+
require_relative "../text"
|
|
23
|
+
require_relative "terminal"
|
|
24
|
+
require_relative "../errors/standard_error_resolver"
|
|
25
25
|
|
|
26
26
|
module ChefApply::UI
|
|
27
27
|
class ErrorPrinter
|
|
@@ -17,11 +17,11 @@
|
|
|
17
17
|
|
|
18
18
|
require "tty-spinner"
|
|
19
19
|
require "tty-cursor"
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
require_relative "../status_reporter"
|
|
21
|
+
require_relative "../config"
|
|
22
|
+
require_relative "../log"
|
|
23
|
+
require_relative "plain_text_element"
|
|
24
|
+
require_relative "plain_text_header"
|
|
25
25
|
|
|
26
26
|
module ChefApply
|
|
27
27
|
module UI
|
data/lib/chef_apply/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: chef-apply
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.6.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Chef Software, Inc
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2021-04-04 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: mixlib-cli
|
|
@@ -156,28 +156,28 @@ dependencies:
|
|
|
156
156
|
requirements:
|
|
157
157
|
- - ">="
|
|
158
158
|
- !ruby/object:Gem::Version
|
|
159
|
-
version: '
|
|
159
|
+
version: '16.0'
|
|
160
160
|
type: :runtime
|
|
161
161
|
prerelease: false
|
|
162
162
|
version_requirements: !ruby/object:Gem::Requirement
|
|
163
163
|
requirements:
|
|
164
164
|
- - ">="
|
|
165
165
|
- !ruby/object:Gem::Version
|
|
166
|
-
version: '
|
|
166
|
+
version: '16.0'
|
|
167
167
|
- !ruby/object:Gem::Dependency
|
|
168
168
|
name: chef-cli
|
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
|
170
170
|
requirements:
|
|
171
171
|
- - ">="
|
|
172
172
|
- !ruby/object:Gem::Version
|
|
173
|
-
version:
|
|
173
|
+
version: 2.0.10
|
|
174
174
|
type: :runtime
|
|
175
175
|
prerelease: false
|
|
176
176
|
version_requirements: !ruby/object:Gem::Requirement
|
|
177
177
|
requirements:
|
|
178
178
|
- - ">="
|
|
179
179
|
- !ruby/object:Gem::Version
|
|
180
|
-
version:
|
|
180
|
+
version: 2.0.10
|
|
181
181
|
- !ruby/object:Gem::Dependency
|
|
182
182
|
name: chef-telemetry
|
|
183
183
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -196,36 +196,22 @@ dependencies:
|
|
|
196
196
|
name: license-acceptance
|
|
197
197
|
requirement: !ruby/object:Gem::Requirement
|
|
198
198
|
requirements:
|
|
199
|
-
- - "~>"
|
|
200
|
-
- !ruby/object:Gem::Version
|
|
201
|
-
version: '1.0'
|
|
202
199
|
- - ">="
|
|
203
200
|
- !ruby/object:Gem::Version
|
|
204
201
|
version: 1.0.11
|
|
202
|
+
- - "<"
|
|
203
|
+
- !ruby/object:Gem::Version
|
|
204
|
+
version: '3'
|
|
205
205
|
type: :runtime
|
|
206
206
|
prerelease: false
|
|
207
207
|
version_requirements: !ruby/object:Gem::Requirement
|
|
208
208
|
requirements:
|
|
209
|
-
- - "~>"
|
|
210
|
-
- !ruby/object:Gem::Version
|
|
211
|
-
version: '1.0'
|
|
212
209
|
- - ">="
|
|
213
210
|
- !ruby/object:Gem::Version
|
|
214
211
|
version: 1.0.11
|
|
215
|
-
-
|
|
216
|
-
name: bundler
|
|
217
|
-
requirement: !ruby/object:Gem::Requirement
|
|
218
|
-
requirements:
|
|
219
|
-
- - ">="
|
|
220
|
-
- !ruby/object:Gem::Version
|
|
221
|
-
version: '0'
|
|
222
|
-
type: :development
|
|
223
|
-
prerelease: false
|
|
224
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
225
|
-
requirements:
|
|
226
|
-
- - ">="
|
|
212
|
+
- - "<"
|
|
227
213
|
- !ruby/object:Gem::Version
|
|
228
|
-
version: '
|
|
214
|
+
version: '3'
|
|
229
215
|
description: Ad-hoc management of individual nodes and devices.
|
|
230
216
|
email:
|
|
231
217
|
- workstation@chef.io
|
|
@@ -265,6 +251,7 @@ files:
|
|
|
265
251
|
- lib/chef_apply/status_reporter.rb
|
|
266
252
|
- lib/chef_apply/target_host.rb
|
|
267
253
|
- lib/chef_apply/target_host/linux.rb
|
|
254
|
+
- lib/chef_apply/target_host/macos.rb
|
|
268
255
|
- lib/chef_apply/target_host/windows.rb
|
|
269
256
|
- lib/chef_apply/target_resolver.rb
|
|
270
257
|
- lib/chef_apply/telemeter.rb
|
|
@@ -294,14 +281,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
294
281
|
requirements:
|
|
295
282
|
- - ">="
|
|
296
283
|
- !ruby/object:Gem::Version
|
|
297
|
-
version: 2.
|
|
284
|
+
version: '2.6'
|
|
298
285
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
299
286
|
requirements:
|
|
300
287
|
- - ">="
|
|
301
288
|
- !ruby/object:Gem::Version
|
|
302
289
|
version: '0'
|
|
303
290
|
requirements: []
|
|
304
|
-
rubygems_version: 3.
|
|
291
|
+
rubygems_version: 3.1.4
|
|
305
292
|
signing_key:
|
|
306
293
|
specification_version: 4
|
|
307
294
|
summary: The ad-hoc execution tool for the Chef ecosystem.
|