license-acceptance 1.0.18 → 1.0.19
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/lib/license_acceptance/acceptor.rb +26 -24
- data/lib/license_acceptance/cli_flags/mixlib_cli.rb +1 -1
- data/lib/license_acceptance/cli_flags/thor.rb +2 -2
- data/lib/license_acceptance/config.rb +5 -4
- data/lib/license_acceptance/product.rb +7 -6
- data/lib/license_acceptance/product_reader.rb +7 -3
- data/lib/license_acceptance/strategy/argument.rb +4 -3
- data/lib/license_acceptance/strategy/environment.rb +3 -2
- data/lib/license_acceptance/strategy/file.rb +8 -8
- data/lib/license_acceptance/strategy/prompt.rb +21 -21
- data/lib/license_acceptance/version.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8383c0bafd2717c7ff9f2af1b0cc6a28b83acb5001150249734e4194a927297a
|
4
|
+
data.tar.gz: 798ba0cdf60a7bd4e6ca8b680eeec5039eeca8caff3a993e48d3fded2875fa37
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: df6e3ccef39dcfef85a6928954cd76d2b9e3ce574291a92f368080fe1594a56b9e30fe5a43ad224994b17ce930bc21cf21a5b2dbdfb3e877e267715ef6ac200e
|
7
|
+
data.tar.gz: 98a5f5e51bf72821399458d4c07f9acc6c0ba69eafe748c8d0bb34c60fec62fe06582430a4cce829fdf6bbef9c1a21b3c7ddb9df4367645410ff6af8fa5134f2
|
data/Gemfile
CHANGED
@@ -11,9 +11,9 @@ require "license_acceptance/strategy/provided_value"
|
|
11
11
|
|
12
12
|
module LicenseAcceptance
|
13
13
|
|
14
|
-
ACCEPT = "accept"
|
15
|
-
ACCEPT_SILENT = "accept-silent"
|
16
|
-
ACCEPT_NO_PERSIST = "accept-no-persist"
|
14
|
+
ACCEPT = "accept".freeze
|
15
|
+
ACCEPT_SILENT = "accept-silent".freeze
|
16
|
+
ACCEPT_NO_PERSIST = "accept-no-persist".freeze
|
17
17
|
|
18
18
|
class Acceptor
|
19
19
|
extend Forwardable
|
@@ -21,7 +21,7 @@ module LicenseAcceptance
|
|
21
21
|
|
22
22
|
attr_reader :config, :product_reader, :env_strategy, :file_strategy, :arg_strategy, :prompt_strategy, :provided_strategy
|
23
23
|
|
24
|
-
def initialize(opts={})
|
24
|
+
def initialize(opts = {})
|
25
25
|
@config = Config.new(opts)
|
26
26
|
Logger.initialize(config.logger)
|
27
27
|
@product_reader = ProductReader.new
|
@@ -74,28 +74,28 @@ module LicenseAcceptance
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
@acceptance_value = accepted_silent? ? ACCEPT_SILENT : ACCEPT
|
77
|
-
|
77
|
+
true
|
78
78
|
elsif config.output.isatty && prompt_strategy.request(missing_licenses) do
|
79
79
|
# We have to infer the acceptance value if they use the prompt to accept
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
end
|
80
|
+
if config.persist
|
81
|
+
@acceptance_value = ACCEPT # rubocop: disable Lint/AssignmentInCondition
|
82
|
+
file_strategy.persist(product_relationship, missing_licenses)
|
83
|
+
else
|
84
|
+
@acceptance_value = ACCEPT_NO_PERSIST # rubocop: disable Lint/AssignmentInCondition
|
85
|
+
[]
|
87
86
|
end
|
88
|
-
|
87
|
+
end
|
88
|
+
true
|
89
89
|
else
|
90
90
|
raise LicenseNotAcceptedError.new(product_relationship.parent, missing_licenses)
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
|
-
def self.check_and_persist!(product_id, version, opts={})
|
94
|
+
def self.check_and_persist!(product_id, version, opts = {})
|
95
95
|
new(opts).check_and_persist!(product_id, version)
|
96
96
|
end
|
97
97
|
|
98
|
-
def self.check_and_persist(product_id, version, opts={})
|
98
|
+
def self.check_and_persist(product_id, version, opts = {})
|
99
99
|
new(opts).check_and_persist(product_id, version)
|
100
100
|
end
|
101
101
|
|
@@ -105,7 +105,8 @@ module LicenseAcceptance
|
|
105
105
|
return false if product.nil?
|
106
106
|
# If they don't pass a version we assume they want latest
|
107
107
|
# All versions in all channels require license acceptance
|
108
|
-
return true if
|
108
|
+
return true if %w{latest unstable current stable}.include?(version.to_s) || version.nil?
|
109
|
+
|
109
110
|
Gem::Version.new(version) >= Gem::Version.new(product.license_required_version)
|
110
111
|
end
|
111
112
|
|
@@ -114,6 +115,7 @@ module LicenseAcceptance
|
|
114
115
|
def id_from_mixlib(mixlib_name)
|
115
116
|
product = product_reader.lookup_by_mixlib(mixlib_name)
|
116
117
|
return nil if product.nil?
|
118
|
+
|
117
119
|
product.id
|
118
120
|
end
|
119
121
|
|
@@ -141,20 +143,20 @@ module LicenseAcceptance
|
|
141
143
|
# In the case where users accept with a command line argument or environment variable
|
142
144
|
# we still want to output the fact that the filesystem was changed.
|
143
145
|
def output_num_persisted(count)
|
144
|
-
s = count > 1 ? "s": ""
|
146
|
+
s = count > 1 ? "s" : ""
|
145
147
|
output.puts <<~EOM
|
146
|
-
|
147
|
-
|
148
|
-
|
148
|
+
#{Strategy::Prompt::BORDER}
|
149
|
+
#{Strategy::Prompt::CHECK} #{count} product license#{s} accepted.
|
150
|
+
#{Strategy::Prompt::BORDER}
|
149
151
|
EOM
|
150
152
|
end
|
151
153
|
|
152
154
|
def output_persist_failed(errs)
|
153
155
|
output.puts <<~EOM
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
156
|
+
#{Strategy::Prompt::BORDER}
|
157
|
+
#{Strategy::Prompt::CHECK} Product license accepted.
|
158
|
+
Could not persist acceptance:\n\t* #{errs.map(&:message).join("\n\t* ")}
|
159
|
+
#{Strategy::Prompt::BORDER}
|
158
160
|
EOM
|
159
161
|
end
|
160
162
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
begin
|
2
|
-
require
|
2
|
+
require "thor"
|
3
3
|
rescue => exception
|
4
4
|
raise "Must have thor gem installed to use this mixin"
|
5
5
|
end
|
@@ -12,7 +12,7 @@ module LicenseAcceptance
|
|
12
12
|
def self.included(klass)
|
13
13
|
klass.class_option :chef_license,
|
14
14
|
type: :string,
|
15
|
-
desc:
|
15
|
+
desc: "Accept the license for this product and any contained products: accept, accept-no-persist, accept-silent"
|
16
16
|
end
|
17
17
|
|
18
18
|
end
|
@@ -1,10 +1,10 @@
|
|
1
|
-
require
|
1
|
+
require "logger"
|
2
2
|
|
3
3
|
module LicenseAcceptance
|
4
4
|
class Config
|
5
5
|
attr_accessor :output, :logger, :license_locations, :persist_location, :persist
|
6
6
|
|
7
|
-
def initialize(opts={})
|
7
|
+
def initialize(opts = {})
|
8
8
|
@output = opts.fetch(:output, $stdout)
|
9
9
|
@logger = opts.fetch(:logger, ::Logger.new(IO::NULL))
|
10
10
|
@license_locations = opts.fetch(:license_locations, default_license_locations)
|
@@ -21,7 +21,7 @@ module LicenseAcceptance
|
|
21
21
|
|
22
22
|
def default_license_locations
|
23
23
|
if windows?
|
24
|
-
root = ENV.fetch("SYSTEMDRIVE","C:")
|
24
|
+
root = ENV.fetch("SYSTEMDRIVE", "C:")
|
25
25
|
l = [ File.join(root, "chef/accepted_licenses/") ]
|
26
26
|
unless is_root?
|
27
27
|
# Look through a list of possible user locations and pick the first one that exists
|
@@ -32,6 +32,7 @@ module LicenseAcceptance
|
|
32
32
|
possible_dirs << ENV["HOMESHARE"] + ENV["HOMEPATH"] if ENV["HOMESHARE"] && ENV["HOMEPATH"]
|
33
33
|
possible_dirs << ENV["USERPROFILE"] if ENV["USERPROFILE"]
|
34
34
|
raise NoValidEnvironmentVar if possible_dirs.empty?
|
35
|
+
|
35
36
|
possible_dirs.each do |possible_dir|
|
36
37
|
if Dir.exist?(possible_dir)
|
37
38
|
full_possible_dir = File.join(possible_dir, ".chef/accepted_licenses/")
|
@@ -42,7 +43,7 @@ module LicenseAcceptance
|
|
42
43
|
end
|
43
44
|
else
|
44
45
|
l = [ "/etc/chef/accepted_licenses/" ]
|
45
|
-
l << File.join(ENV[
|
46
|
+
l << File.join(ENV["HOME"], ".chef/accepted_licenses/") unless is_root?
|
46
47
|
end
|
47
48
|
l
|
48
49
|
end
|
@@ -14,14 +14,15 @@ module LicenseAcceptance
|
|
14
14
|
|
15
15
|
def ==(other)
|
16
16
|
return false if other.class != Product
|
17
|
+
|
17
18
|
if other.id == id &&
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
other.pretty_name == pretty_name &&
|
20
|
+
other.filename == filename &&
|
21
|
+
other.mixlib_name == mixlib_name
|
22
|
+
other.license_required_version == license_required_version
|
23
|
+
return true
|
23
24
|
end
|
24
|
-
|
25
|
+
false
|
25
26
|
end
|
26
27
|
|
27
28
|
end
|
@@ -18,7 +18,7 @@ module LicenseAcceptance
|
|
18
18
|
toml = Tomlrb.load_file(location, symbolize_keys: false)
|
19
19
|
raise InvalidProductInfo.new(location) if toml.empty? || toml["products"].nil? || toml["relationships"].nil?
|
20
20
|
|
21
|
-
|
21
|
+
toml["products"].each do |product|
|
22
22
|
products[product["id"]] = Product.new(
|
23
23
|
product["id"], product["pretty_name"],
|
24
24
|
product["filename"], product["mixlib_name"],
|
@@ -26,7 +26,7 @@ module LicenseAcceptance
|
|
26
26
|
)
|
27
27
|
end
|
28
28
|
|
29
|
-
|
29
|
+
toml["relationships"].each do |parent_id, children|
|
30
30
|
parent = products[parent_id]
|
31
31
|
raise UnknownParent.new(parent_id) if parent.nil?
|
32
32
|
# Its fine to not have a relationship entry, but not fine to have
|
@@ -34,9 +34,11 @@ module LicenseAcceptance
|
|
34
34
|
if children.nil? || children.empty? || !children.is_a?(Array)
|
35
35
|
raise NoChildRelationships.new(parent)
|
36
36
|
end
|
37
|
+
|
37
38
|
children.map! do |child_id|
|
38
39
|
child = products[child_id]
|
39
40
|
raise UnknownChild.new(child_id) if child.nil?
|
41
|
+
|
40
42
|
child
|
41
43
|
end
|
42
44
|
relationships[parent] = children
|
@@ -52,6 +54,7 @@ module LicenseAcceptance
|
|
52
54
|
if ENV["CHEF_LICENSE_PRODUCT_INFO"]
|
53
55
|
return ENV["CHEF_LICENSE_PRODUCT_INFO"]
|
54
56
|
end
|
57
|
+
|
55
58
|
File.absolute_path(File.join(__FILE__, "../../../config/product_info.toml"))
|
56
59
|
end
|
57
60
|
|
@@ -60,9 +63,10 @@ module LicenseAcceptance
|
|
60
63
|
raise UnknownProduct.new(parent_id)
|
61
64
|
end
|
62
65
|
children = relationships.fetch(parent_product, [])
|
63
|
-
|
66
|
+
unless parent_version.is_a? String
|
64
67
|
raise ProductVersionTypeError.new(parent_version)
|
65
68
|
end
|
69
|
+
|
66
70
|
ProductRelationship.new(parent_product, children, parent_version)
|
67
71
|
end
|
68
72
|
|
@@ -30,14 +30,15 @@ module LicenseAcceptance
|
|
30
30
|
if argv.include?("--chef-license=#{sought}")
|
31
31
|
return true
|
32
32
|
end
|
33
|
+
|
33
34
|
i = argv.index("--chef-license")
|
34
35
|
unless i.nil?
|
35
|
-
val = argv[i+1]
|
36
|
-
if val
|
36
|
+
val = argv[i + 1]
|
37
|
+
if !val.nil? && val.downcase == sought
|
37
38
|
return true
|
38
39
|
end
|
39
40
|
end
|
40
|
-
|
41
|
+
false
|
41
42
|
end
|
42
43
|
end
|
43
44
|
end
|
@@ -27,10 +27,11 @@ module LicenseAcceptance
|
|
27
27
|
private
|
28
28
|
|
29
29
|
def look_for_value(sought)
|
30
|
-
if env[
|
30
|
+
if env["CHEF_LICENSE"] && env["CHEF_LICENSE"].downcase == sought
|
31
31
|
return true
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
|
+
false
|
34
35
|
end
|
35
36
|
|
36
37
|
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
1
|
+
require "date"
|
2
|
+
require "yaml"
|
3
|
+
require "fileutils"
|
4
|
+
require "etc"
|
5
5
|
require "license_acceptance/logger"
|
6
6
|
require "license_acceptance/strategy/base"
|
7
7
|
|
@@ -49,7 +49,7 @@ module LicenseAcceptance
|
|
49
49
|
parent_version = product_relationship.parent_version
|
50
50
|
root_dir = config.persist_location
|
51
51
|
|
52
|
-
|
52
|
+
unless Dir.exist?(root_dir)
|
53
53
|
begin
|
54
54
|
FileUtils.mkdir_p(root_dir)
|
55
55
|
rescue StandardError => e
|
@@ -70,7 +70,7 @@ module LicenseAcceptance
|
|
70
70
|
errs << err unless err.nil?
|
71
71
|
end
|
72
72
|
end
|
73
|
-
|
73
|
+
errs
|
74
74
|
end
|
75
75
|
|
76
76
|
private
|
@@ -91,11 +91,11 @@ module LicenseAcceptance
|
|
91
91
|
contents = Hash[contents.map { |k, v| [k.to_s, v] }]
|
92
92
|
license_file << YAML.dump(contents)
|
93
93
|
end
|
94
|
-
|
94
|
+
nil
|
95
95
|
rescue StandardError => e
|
96
96
|
msg = "Could not persist license to #{path}"
|
97
97
|
logger.info "#{msg}\n\t#{e.message}\n\t#{e.backtrace.join("\n\t")}"
|
98
|
-
|
98
|
+
e
|
99
99
|
end
|
100
100
|
|
101
101
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "tty-prompt"
|
2
|
+
require "pastel"
|
3
3
|
require "license_acceptance/logger"
|
4
4
|
require "license_acceptance/strategy/base"
|
5
5
|
require "timeout"
|
@@ -17,30 +17,30 @@ module LicenseAcceptance
|
|
17
17
|
@output = config.output
|
18
18
|
end
|
19
19
|
|
20
|
-
WIDTH = 50
|
20
|
+
WIDTH = 50
|
21
21
|
PASTEL = Pastel.new
|
22
22
|
BORDER = "+---------------------------------------------+".freeze
|
23
23
|
YES = PASTEL.green.bold("yes")
|
24
|
-
CHECK
|
24
|
+
CHECK = PASTEL.green("✔")
|
25
25
|
|
26
26
|
def request(missing_licenses, &persist_callback)
|
27
27
|
logger.debug("Requesting a license for #{missing_licenses.map(&:id)}")
|
28
28
|
c = missing_licenses.size
|
29
|
-
s = c > 1 ? "s": ""
|
29
|
+
s = c > 1 ? "s" : ""
|
30
30
|
|
31
31
|
acceptance_question = "Do you accept the #{c} product license#{s} (#{YES}/no)?"
|
32
32
|
output.puts <<~EOM
|
33
|
-
|
34
|
-
|
33
|
+
#{BORDER}
|
34
|
+
Chef License Acceptance
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
36
|
+
Before you can continue, #{c} product license#{s}
|
37
|
+
must be accepted. View the license at
|
38
|
+
https://www.chef.io/end-user-license-agreement/
|
39
39
|
|
40
|
-
|
41
|
-
|
40
|
+
License#{s} that need accepting:
|
41
|
+
* #{missing_licenses.map(&:pretty_name).join("\n * ")}
|
42
42
|
|
43
|
-
|
43
|
+
#{acceptance_question}
|
44
44
|
|
45
45
|
EOM
|
46
46
|
|
@@ -51,10 +51,10 @@ module LicenseAcceptance
|
|
51
51
|
|
52
52
|
output.puts <<~EOM
|
53
53
|
|
54
|
-
|
55
|
-
|
54
|
+
If you do not accept this license you will
|
55
|
+
not be able to use Chef products.
|
56
56
|
|
57
|
-
|
57
|
+
#{acceptance_question}
|
58
58
|
|
59
59
|
EOM
|
60
60
|
|
@@ -62,7 +62,7 @@ module LicenseAcceptance
|
|
62
62
|
if answer != "yes"
|
63
63
|
output.puts BORDER
|
64
64
|
end
|
65
|
-
|
65
|
+
answer
|
66
66
|
end
|
67
67
|
|
68
68
|
private
|
@@ -73,7 +73,7 @@ module LicenseAcceptance
|
|
73
73
|
|
74
74
|
answer = "no"
|
75
75
|
begin
|
76
|
-
Timeout
|
76
|
+
Timeout.timeout(60, PromptTimeout) do
|
77
77
|
answer = prompt.ask(">") do |q|
|
78
78
|
q.modify :down, :trim
|
79
79
|
q.required true
|
@@ -95,13 +95,13 @@ module LicenseAcceptance
|
|
95
95
|
output.puts "#{CHECK} #{c} product license#{s} persisted.\n\n"
|
96
96
|
else
|
97
97
|
output.puts <<~EOM
|
98
|
-
|
99
|
-
|
98
|
+
#{CHECK} #{c} product license#{s} accepted.
|
99
|
+
Could not persist acceptance:\n\t* #{errs.map(&:message).join("\n\t* ")}
|
100
100
|
EOM
|
101
101
|
end
|
102
102
|
return true
|
103
103
|
end
|
104
|
-
|
104
|
+
false
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: license-acceptance
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.19
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- tyler-ball
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-04-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pastel
|
@@ -184,6 +184,20 @@ dependencies:
|
|
184
184
|
- - "~>"
|
185
185
|
- !ruby/object:Gem::Version
|
186
186
|
version: '0.2'
|
187
|
+
- !ruby/object:Gem::Dependency
|
188
|
+
name: chefstyle
|
189
|
+
requirement: !ruby/object:Gem::Requirement
|
190
|
+
requirements:
|
191
|
+
- - ">="
|
192
|
+
- !ruby/object:Gem::Version
|
193
|
+
version: '0'
|
194
|
+
type: :development
|
195
|
+
prerelease: false
|
196
|
+
version_requirements: !ruby/object:Gem::Requirement
|
197
|
+
requirements:
|
198
|
+
- - ">="
|
199
|
+
- !ruby/object:Gem::Version
|
200
|
+
version: '0'
|
187
201
|
description: Chef End User License Agreement Acceptance for Ruby products
|
188
202
|
email:
|
189
203
|
- tball@chef.io
|