chef-licensing 0.4.43
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +1 -0
- data/chef-licensing.gemspec +35 -0
- data/lib/chef-licensing/api/client.rb +39 -0
- data/lib/chef-licensing/api/describe.rb +62 -0
- data/lib/chef-licensing/api/license_feature_entitlement.rb +55 -0
- data/lib/chef-licensing/api/license_software_entitlement.rb +53 -0
- data/lib/chef-licensing/api/list_licenses.rb +30 -0
- data/lib/chef-licensing/api/parser/client.rb +100 -0
- data/lib/chef-licensing/api/parser/describe.rb +118 -0
- data/lib/chef-licensing/cli_flags/mixlib_cli.rb +28 -0
- data/lib/chef-licensing/cli_flags/thor.rb +21 -0
- data/lib/chef-licensing/config.rb +44 -0
- data/lib/chef-licensing/config_fetcher/arg_fetcher.rb +38 -0
- data/lib/chef-licensing/config_fetcher/env_fetcher.rb +21 -0
- data/lib/chef-licensing/context.rb +98 -0
- data/lib/chef-licensing/exceptions/client_error.rb +9 -0
- data/lib/chef-licensing/exceptions/describe_error.rb +9 -0
- data/lib/chef-licensing/exceptions/error.rb +4 -0
- data/lib/chef-licensing/exceptions/feature_not_entitled.rb +9 -0
- data/lib/chef-licensing/exceptions/invalid_license.rb +10 -0
- data/lib/chef-licensing/exceptions/license_generation_failed.rb +9 -0
- data/lib/chef-licensing/exceptions/license_generation_rejected.rb +7 -0
- data/lib/chef-licensing/exceptions/list_licenses_error.rb +12 -0
- data/lib/chef-licensing/exceptions/missing_api_credentials_error.rb +7 -0
- data/lib/chef-licensing/exceptions/restful_client_connection_error.rb +9 -0
- data/lib/chef-licensing/exceptions/restful_client_error.rb +9 -0
- data/lib/chef-licensing/exceptions/software_not_entitled.rb +9 -0
- data/lib/chef-licensing/license.rb +151 -0
- data/lib/chef-licensing/license_key_fetcher/base.rb +28 -0
- data/lib/chef-licensing/license_key_fetcher/chef_licensing_interactions.yaml +534 -0
- data/lib/chef-licensing/license_key_fetcher/file.rb +275 -0
- data/lib/chef-licensing/license_key_fetcher/prompt.rb +43 -0
- data/lib/chef-licensing/license_key_fetcher.rb +314 -0
- data/lib/chef-licensing/license_key_generator.rb +47 -0
- data/lib/chef-licensing/license_key_validator.rb +24 -0
- data/lib/chef-licensing/licensing_service/local.rb +29 -0
- data/lib/chef-licensing/list_license_keys.rb +142 -0
- data/lib/chef-licensing/restful_client/base.rb +139 -0
- data/lib/chef-licensing/restful_client/middleware/exceptions_handler.rb +16 -0
- data/lib/chef-licensing/restful_client/v1.rb +17 -0
- data/lib/chef-licensing/tui_engine/tui_actions.rb +238 -0
- data/lib/chef-licensing/tui_engine/tui_engine.rb +174 -0
- data/lib/chef-licensing/tui_engine/tui_engine_state.rb +62 -0
- data/lib/chef-licensing/tui_engine/tui_exceptions.rb +17 -0
- data/lib/chef-licensing/tui_engine/tui_interaction.rb +17 -0
- data/lib/chef-licensing/tui_engine/tui_prompt.rb +117 -0
- data/lib/chef-licensing/tui_engine.rb +2 -0
- data/lib/chef-licensing/version.rb +3 -0
- data/lib/chef-licensing.rb +70 -0
- metadata +191 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 964f7cfe2142120460f62fe5d859ed5a1fee820b023a66d79d9a5e993a3f83aa
|
4
|
+
data.tar.gz: 51459f83f1c053b6da1ef961e550951ed709e1f87cc5ff8dc8e84f2ac3a1f76d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 57a658f34d4d126b60311613f0ca6b8973fd29b3be180cc7082023c51aeef4f02ce2fa8f132e18ae2574137d97fe1da27f3ad2bd66e787d038fd4ded954d07c5
|
7
|
+
data.tar.gz: aaa6881007ef1f2377dfe2cce95cf46114a2743d0568e2776777d9ebafe6c49af540c29d2b97678dade43e0634dc018d89bd719f19bc6102189bb957f6f60d45
|
data/LICENSE
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Proprietary code. All rights reserved.
|
@@ -0,0 +1,35 @@
|
|
1
|
+
lib = File.expand_path("lib", __dir__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require "chef-licensing/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "chef-licensing"
|
7
|
+
spec.version = ChefLicensing::VERSION
|
8
|
+
spec.authors = ["Inspec Team"]
|
9
|
+
spec.email = ["inspec@progress.com"]
|
10
|
+
spec.license = "LicenseRef-LICENSE"
|
11
|
+
|
12
|
+
spec.summary = %q{Chef License storage, generation, and entitlement}
|
13
|
+
spec.description = %q{Ruby library to support CLI tools that use Progress Chef license storage, generation, and entitlement.}
|
14
|
+
spec.homepage = "https://github.com/chef/chef-licensing"
|
15
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
|
16
|
+
|
17
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
18
|
+
spec.metadata["source_code_uri"] = "https://github.com/chef/chef-licensing"
|
19
|
+
|
20
|
+
# Specify which files should be added to the gem when it is released.
|
21
|
+
spec.files =
|
22
|
+
Dir.glob("{{lib,etc}/**/*,LICENSE,chef-licensing.gemspec}")
|
23
|
+
.reject { |f| File.directory?(f) }
|
24
|
+
|
25
|
+
spec.bindir = "exe"
|
26
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
27
|
+
spec.require_paths = ["lib"]
|
28
|
+
|
29
|
+
spec.add_dependency "chef-config", ">= 15"
|
30
|
+
spec.add_dependency "tty-prompt", "~> 0.23"
|
31
|
+
spec.add_dependency "faraday", ">= 1", "< 3"
|
32
|
+
spec.add_dependency "faraday-http-cache"
|
33
|
+
spec.add_dependency "activesupport", "~> 7.0", ">= 7.0.4.2"
|
34
|
+
spec.add_dependency "tty-spinner", "~> 0.9.3"
|
35
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require_relative "../restful_client/v1"
|
2
|
+
require_relative "../exceptions/client_error"
|
3
|
+
require_relative "../license"
|
4
|
+
require_relative "../config"
|
5
|
+
|
6
|
+
module ChefLicensing
|
7
|
+
module Api
|
8
|
+
class Client
|
9
|
+
attr_reader :license_keys, :entitlement_id
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def info(opts = {})
|
13
|
+
new(opts).info
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(opts = {})
|
18
|
+
@license_keys = opts[:license_keys] || raise(ArgumentError, "Missing Params: `license_keys`")
|
19
|
+
@restful_client = opts[:restful_client] ? opts[:restful_client].new : ChefLicensing::RestfulClient::V1.new
|
20
|
+
end
|
21
|
+
|
22
|
+
def info
|
23
|
+
response = restful_client.client(license_keys: license_keys.join(","), entitlement_id: ChefLicensing::Config.chef_entitlement_id)
|
24
|
+
if response.data
|
25
|
+
ChefLicensing::License.new(
|
26
|
+
data: response.data,
|
27
|
+
api_parser: ChefLicensing::Api::Parser::Client
|
28
|
+
)
|
29
|
+
else
|
30
|
+
raise(ChefLicensing::ClientError, response.message)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
attr_reader :restful_client
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require_relative "../restful_client/v1"
|
2
|
+
require_relative "../exceptions/describe_error"
|
3
|
+
require_relative "../license"
|
4
|
+
require_relative "../config"
|
5
|
+
require "ostruct" unless defined?(OpenStruct)
|
6
|
+
|
7
|
+
module ChefLicensing
|
8
|
+
module Api
|
9
|
+
class Describe
|
10
|
+
attr_reader :license_keys
|
11
|
+
|
12
|
+
class << self
|
13
|
+
def list(opts = {})
|
14
|
+
new(opts).list
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize(opts = {})
|
19
|
+
@license_keys = opts[:license_keys] || raise(ArgumentError, "Missing Params: `license_keys`")
|
20
|
+
@restful_client = opts[:restful_client] ? opts[:restful_client].new : ChefLicensing::RestfulClient::V1.new
|
21
|
+
end
|
22
|
+
|
23
|
+
def list
|
24
|
+
response_data = get_describe_api_response_data
|
25
|
+
|
26
|
+
list_of_licenses = []
|
27
|
+
|
28
|
+
response_data.license.each do |license|
|
29
|
+
# license object created to be fed to parser
|
30
|
+
license_object = OpenStruct.new({
|
31
|
+
"license" => license,
|
32
|
+
"assets" => response_data.Assets,
|
33
|
+
"features" => response_data.Features,
|
34
|
+
"software" => response_data.Software,
|
35
|
+
})
|
36
|
+
|
37
|
+
list_of_licenses << ChefLicensing::License.new(
|
38
|
+
data: license_object,
|
39
|
+
product_name: ChefLicensing::Config.chef_product_name,
|
40
|
+
api_parser: ChefLicensing::Api::Parser::Describe
|
41
|
+
)
|
42
|
+
end
|
43
|
+
# returns list of license data model object
|
44
|
+
list_of_licenses
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
attr_reader :restful_client
|
50
|
+
|
51
|
+
def get_describe_api_response_data
|
52
|
+
response = restful_client.describe(license_keys: license_keys.join(","), entitlement_id: ChefLicensing::Config.chef_entitlement_id)
|
53
|
+
|
54
|
+
raise(ChefLicensing::DescribeError, response.message) unless response.data
|
55
|
+
|
56
|
+
raise(ChefLicensing::DescribeError, "No license details found for the given license keys") unless response.data&.license.is_a?(Array) || response.data.license&.any?
|
57
|
+
|
58
|
+
response.data
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require_relative "../restful_client/v1"
|
2
|
+
|
3
|
+
module ChefLicensing
|
4
|
+
module Api
|
5
|
+
class LicenseFeatureEntitlement
|
6
|
+
attr_reader :license_keys
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def check_entitlement!(license_keys: [], feature_name: nil, feature_id: nil)
|
10
|
+
new(license_keys: license_keys, feature_name: feature_name , feature_id: feature_id).check_entitlement!
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(license_keys: [], feature_name: nil, feature_id: nil, restful_client: ChefLicensing::RestfulClient::V1)
|
15
|
+
license_keys || raise(ArgumentError, "Missing Params: `license_keys`")
|
16
|
+
@license_keys = license_keys.is_a?(Array) ? license_keys : [license_keys]
|
17
|
+
@feature_name = feature_name
|
18
|
+
@feature_id = feature_id
|
19
|
+
raise ArgumentError, "Either of `feature_id` or `feature_name` should be provided" if feature_name.nil? && feature_id.nil?
|
20
|
+
|
21
|
+
@restful_client = restful_client.new
|
22
|
+
end
|
23
|
+
|
24
|
+
def check_entitlement!
|
25
|
+
response = make_request
|
26
|
+
response.data.entitled || raise(ChefLicensing::FeatureNotEntitled)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
attr_reader :restful_client, :feature_id, :feature_name
|
32
|
+
|
33
|
+
def make_request
|
34
|
+
payload = build_payload
|
35
|
+
if feature_name
|
36
|
+
restful_client.feature_by_name(payload)
|
37
|
+
else
|
38
|
+
restful_client.feature_by_id(payload)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def build_payload
|
43
|
+
{
|
44
|
+
licenseIds: license_keys,
|
45
|
+
}.tap do |payload|
|
46
|
+
if feature_name
|
47
|
+
payload[:featureName] = feature_name
|
48
|
+
else
|
49
|
+
payload[:featureGuid] = feature_id
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require_relative "../restful_client/v1"
|
2
|
+
|
3
|
+
module ChefLicensing
|
4
|
+
module Api
|
5
|
+
class LicenseSoftwareEntitlement
|
6
|
+
attr_reader :license_keys
|
7
|
+
|
8
|
+
def self.check!(license_keys: [], software_entitlement_name: nil, software_entitlement_id: nil)
|
9
|
+
new(license_keys: license_keys, software_entitlement_name: software_entitlement_name, software_entitlement_id: software_entitlement_id).check!
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(license_keys: [], software_entitlement_name: nil, software_entitlement_id: nil, restful_client: ChefLicensing::RestfulClient::V1)
|
13
|
+
@license_keys = license_keys
|
14
|
+
@entitlement_id = software_entitlement_id
|
15
|
+
@entitlement_name = software_entitlement_name
|
16
|
+
|
17
|
+
raise ArgumentError, "Either of `software_entitlement_id` or `software_entitlement_name` should be provided" if software_entitlement_name.nil? && software_entitlement_id.nil?
|
18
|
+
|
19
|
+
@restful_client = restful_client.new
|
20
|
+
end
|
21
|
+
|
22
|
+
def check!
|
23
|
+
response = make_request
|
24
|
+
response.data.entitled || raise(ChefLicensing::SoftwareNotEntitled)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
attr_reader :restful_client, :entitlement_id, :entitlement_name
|
30
|
+
|
31
|
+
def make_request
|
32
|
+
payload = build_payload
|
33
|
+
if entitlement_name
|
34
|
+
restful_client.entitlement_by_name(payload)
|
35
|
+
else
|
36
|
+
restful_client.entitlement_by_id(payload)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def build_payload
|
41
|
+
{
|
42
|
+
licenseIds: license_keys,
|
43
|
+
}.tap do |payload|
|
44
|
+
if entitlement_name
|
45
|
+
payload[:entitlementName] = entitlement_name
|
46
|
+
else
|
47
|
+
payload[:entitlementGuid] = entitlement_id
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require_relative "../restful_client/v1"
|
2
|
+
require_relative "../exceptions/list_licenses_error"
|
3
|
+
require_relative "../config"
|
4
|
+
|
5
|
+
module ChefLicensing
|
6
|
+
module Api
|
7
|
+
class ListLicenses
|
8
|
+
class << self
|
9
|
+
def info(opts = {})
|
10
|
+
new(opts).info
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(opts = {})
|
15
|
+
@restful_client = opts[:restful_client] ? opts[:restful_client].new : ChefLicensing::RestfulClient::V1.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def info
|
19
|
+
response = restful_client.list_licenses
|
20
|
+
raise ChefLicensing::ListLicensesError.new(response.message, response.status_code) unless response.status_code == 200 && response.data
|
21
|
+
|
22
|
+
response.data
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
attr_reader :restful_client
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require "ostruct" unless defined?(OpenStruct)
|
2
|
+
module ChefLicensing
|
3
|
+
module Api
|
4
|
+
module Parser
|
5
|
+
class Client
|
6
|
+
|
7
|
+
# Uses response from /client API
|
8
|
+
# This parser formats the response which will enable creation of license data object.
|
9
|
+
|
10
|
+
attr_reader :data, :client_data
|
11
|
+
|
12
|
+
def initialize(data)
|
13
|
+
# API call response
|
14
|
+
@data = data
|
15
|
+
@client_data = data.client || OpenStruct.new({})
|
16
|
+
end
|
17
|
+
|
18
|
+
def parse_id
|
19
|
+
nil
|
20
|
+
end
|
21
|
+
|
22
|
+
def parse_license_type
|
23
|
+
client_data.license
|
24
|
+
end
|
25
|
+
|
26
|
+
def parse_status
|
27
|
+
client_data.status
|
28
|
+
end
|
29
|
+
|
30
|
+
# Parse expiration details
|
31
|
+
|
32
|
+
def parse_expiration_date
|
33
|
+
client_data.changesOn
|
34
|
+
end
|
35
|
+
|
36
|
+
def parse_license_expiration_status
|
37
|
+
client_data.changesTo
|
38
|
+
end
|
39
|
+
|
40
|
+
# Parse usage details
|
41
|
+
def parse_limits
|
42
|
+
if data.client.nil? || data.client.empty?
|
43
|
+
[]
|
44
|
+
else
|
45
|
+
[{
|
46
|
+
"usage_status" => client_data.usage,
|
47
|
+
"usage_limit" => client_data.limit,
|
48
|
+
"usage_measure" => client_data.measure,
|
49
|
+
"used" => client_data.used,
|
50
|
+
}]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Parse entitlements
|
55
|
+
|
56
|
+
def parse_feature_entitlements
|
57
|
+
features = []
|
58
|
+
features_data = data.features || []
|
59
|
+
features_data.each do |feature|
|
60
|
+
feature_info = {
|
61
|
+
"id" => feature.id,
|
62
|
+
"name" => feature.name,
|
63
|
+
}
|
64
|
+
features << feature_info
|
65
|
+
end
|
66
|
+
features
|
67
|
+
end
|
68
|
+
|
69
|
+
def parse_software_entitlements
|
70
|
+
if data.entitlement.nil? || data.entitlement.empty?
|
71
|
+
[]
|
72
|
+
else
|
73
|
+
require "date"
|
74
|
+
entitlement_status = (data.entitlement.end >= Date.today.to_s) ? "Active" : "Expired"
|
75
|
+
# sending status based on end date
|
76
|
+
[{
|
77
|
+
"id" => data.entitlement.id,
|
78
|
+
"name" => data.entitlement.name,
|
79
|
+
"entitled" => data.entitlement.entitled,
|
80
|
+
"status" => entitlement_status,
|
81
|
+
}]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def parse_asset_entitlements
|
86
|
+
assets = []
|
87
|
+
assets_data = data.assets || []
|
88
|
+
assets_data.each do |asset|
|
89
|
+
asset_info = {
|
90
|
+
"id" => asset.id,
|
91
|
+
"name" => asset.name,
|
92
|
+
}
|
93
|
+
assets << asset_info
|
94
|
+
end
|
95
|
+
assets
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require "ostruct" unless defined?(OpenStruct)
|
2
|
+
module ChefLicensing
|
3
|
+
module Api
|
4
|
+
module Parser
|
5
|
+
class Describe
|
6
|
+
|
7
|
+
# Uses response from /describe API
|
8
|
+
# This parser formats the response which will enable creation of license data object.
|
9
|
+
|
10
|
+
attr_reader :data, :license_data
|
11
|
+
|
12
|
+
def initialize(data)
|
13
|
+
@data = data
|
14
|
+
@license_data = data.license || OpenStruct.new({})
|
15
|
+
end
|
16
|
+
|
17
|
+
def parse_id
|
18
|
+
license_data.licenseKey
|
19
|
+
end
|
20
|
+
|
21
|
+
def parse_license_type
|
22
|
+
license_data.licenseType
|
23
|
+
end
|
24
|
+
|
25
|
+
def parse_status
|
26
|
+
license_data.status
|
27
|
+
end
|
28
|
+
|
29
|
+
# Parse expiration details
|
30
|
+
|
31
|
+
def parse_expiration_date
|
32
|
+
license_data.end
|
33
|
+
end
|
34
|
+
|
35
|
+
def parse_license_expiration_status
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
|
39
|
+
# Parse usage details
|
40
|
+
|
41
|
+
def parse_limits
|
42
|
+
limits = []
|
43
|
+
limits_data = license_data.limits || []
|
44
|
+
limits_data.each do |limit|
|
45
|
+
limit_details = {
|
46
|
+
"usage_status" => limit.status,
|
47
|
+
"usage_limit" => limit.amount,
|
48
|
+
"usage_measure" => limit.measure,
|
49
|
+
"used" => limit.used,
|
50
|
+
"software" => limit.software,
|
51
|
+
}
|
52
|
+
limits << limit_details
|
53
|
+
end
|
54
|
+
limits
|
55
|
+
end
|
56
|
+
|
57
|
+
# Parse entitlements
|
58
|
+
|
59
|
+
def parse_feature_entitlements
|
60
|
+
features = []
|
61
|
+
features_data = data.features || []
|
62
|
+
features_data.each do |feature|
|
63
|
+
feature.from.each do |from_info|
|
64
|
+
if from_info.license == parse_id
|
65
|
+
feature_details = {
|
66
|
+
"status" => from_info.status,
|
67
|
+
"entitled" => feature.entitled,
|
68
|
+
"id" => feature.id,
|
69
|
+
"name" => feature.name,
|
70
|
+
}
|
71
|
+
features << feature_details
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
features
|
76
|
+
end
|
77
|
+
|
78
|
+
def parse_software_entitlements
|
79
|
+
softwares = []
|
80
|
+
softwares_data = data.software || []
|
81
|
+
softwares_data.select do |software|
|
82
|
+
software.from.each do |from_info|
|
83
|
+
if from_info.license == parse_id
|
84
|
+
software_details = {
|
85
|
+
"status" => from_info.status,
|
86
|
+
"entitled" => software.entitled,
|
87
|
+
"id" => software.id,
|
88
|
+
"name" => software.name,
|
89
|
+
}
|
90
|
+
softwares << software_details
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
softwares
|
95
|
+
end
|
96
|
+
|
97
|
+
def parse_asset_entitlements
|
98
|
+
assets = []
|
99
|
+
assets_data = data.assets || []
|
100
|
+
assets_data.select do |asset|
|
101
|
+
asset.from.each do |from_info|
|
102
|
+
if from_info.license == parse_id
|
103
|
+
asset_details = {
|
104
|
+
"status" => from_info.status,
|
105
|
+
"entitled" => asset.entitled,
|
106
|
+
"id" => asset.id,
|
107
|
+
"name" => asset.name,
|
108
|
+
}
|
109
|
+
assets << asset_details
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
assets
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
begin
|
2
|
+
require "mixlib/cli" unless defined?(Mixlib::CLI)
|
3
|
+
rescue
|
4
|
+
raise "Must have mixlib-cli gem installed to use this mixin"
|
5
|
+
end
|
6
|
+
|
7
|
+
module ChefLicensing
|
8
|
+
module CLIFlags
|
9
|
+
|
10
|
+
module MixlibCLI
|
11
|
+
|
12
|
+
def self.included(klass)
|
13
|
+
# TBD need to confirm the name of the option
|
14
|
+
klass.option :chef_license_key,
|
15
|
+
long: "--chef-license-key KEY",
|
16
|
+
description: "Add a new Chef License Key to the license store. Ignores duplicates (not applicable to local licensing service)",
|
17
|
+
required: false
|
18
|
+
|
19
|
+
klass.option :chef_license_server,
|
20
|
+
long: "--chef-license-server URL",
|
21
|
+
description: "Add a custom Chef License Server URL. Overrides the global license server URL.",
|
22
|
+
required: false
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
begin
|
2
|
+
require "thor" unless defined?(Thor)
|
3
|
+
rescue
|
4
|
+
raise "Must have thor gem installed to use this mixin"
|
5
|
+
end
|
6
|
+
|
7
|
+
module ChefLicensing
|
8
|
+
module CLIFlags
|
9
|
+
module Thor
|
10
|
+
def self.included(klass)
|
11
|
+
# TBD need to confirm the name of the option
|
12
|
+
klass.class_option :chef_license_key,
|
13
|
+
type: :string,
|
14
|
+
desc: "Add a new Chef License Key to the license store. Ignores duplicates (not applicable to local licensing service)"
|
15
|
+
klass.class_option :chef_license_server,
|
16
|
+
type: :string,
|
17
|
+
desc: "Add a custom Chef License Server URL. Overrides the global license server URL."
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require "singleton" unless defined?(Singleton)
|
2
|
+
require "logger"
|
3
|
+
require_relative "config_fetcher/arg_fetcher"
|
4
|
+
require_relative "config_fetcher/env_fetcher"
|
5
|
+
require_relative "license_key_fetcher/file"
|
6
|
+
|
7
|
+
# Config class handles all configuration related to chef-licensing
|
8
|
+
# Values can be set via block, environment variable or command line argument
|
9
|
+
|
10
|
+
# Licensing service detection
|
11
|
+
require_relative "licensing_service/local"
|
12
|
+
|
13
|
+
module ChefLicensing
|
14
|
+
class Config
|
15
|
+
class << self
|
16
|
+
attr_writer :license_server_url, :logger, :output, :license_server_url_check_in_file
|
17
|
+
|
18
|
+
# is_local_license_service is used by context class
|
19
|
+
attr_accessor :is_local_license_service, :chef_entitlement_id, :chef_product_name, :chef_executable_name
|
20
|
+
|
21
|
+
def license_server_url(opts = {})
|
22
|
+
return @license_server_url if @license_server_url && @license_server_url_check_in_file
|
23
|
+
|
24
|
+
license_server_url_from_system = ChefLicensing::ArgFetcher.fetch_value("--chef-license-server", :string) || ChefLicensing::EnvFetcher.fetch_value("CHEF_LICENSE_SERVER", :string)
|
25
|
+
|
26
|
+
@license_server_url = ChefLicensing::LicenseKeyFetcher::File.fetch_or_persist_url(@license_server_url, license_server_url_from_system, opts)
|
27
|
+
@license_server_url_check_in_file = true
|
28
|
+
@license_server_url
|
29
|
+
end
|
30
|
+
|
31
|
+
def logger
|
32
|
+
return @logger if @logger
|
33
|
+
|
34
|
+
@logger = Logger.new(STDERR)
|
35
|
+
@logger.level = Logger::INFO
|
36
|
+
@logger
|
37
|
+
end
|
38
|
+
|
39
|
+
def output
|
40
|
+
@output ||= STDOUT
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module ChefLicensing
|
2
|
+
class ArgFetcher
|
3
|
+
|
4
|
+
def initialize(argv = ARGV)
|
5
|
+
@argv = argv
|
6
|
+
end
|
7
|
+
|
8
|
+
def fetch_value(arg_name, arg_type = :string)
|
9
|
+
case arg_type
|
10
|
+
when :boolean
|
11
|
+
@argv.include?(arg_name)
|
12
|
+
when :string
|
13
|
+
# TODO: Refactor this code to use some library in near future
|
14
|
+
# There were some issues with OptionParser, so we are using this
|
15
|
+
# custom code for now.
|
16
|
+
|
17
|
+
# Currently, we are supporting two ways of passing arguments:
|
18
|
+
# 1. --chef-license-server foo
|
19
|
+
# 2. --chef-license-server=foo
|
20
|
+
|
21
|
+
# Check if argument is passed as: --chef-license-server foo
|
22
|
+
arg_value = @argv.include?(arg_name) ? @argv[@argv.index(arg_name) + 1] : nil
|
23
|
+
|
24
|
+
# Check if argument is passed as: --chef-license-server=foo
|
25
|
+
# only if arg_value is nil
|
26
|
+
if arg_value.nil?
|
27
|
+
arg_value = @argv.select { |arg| arg.start_with?("#{arg_name}=") }.first
|
28
|
+
arg_value = arg_value.split("=").last if arg_value
|
29
|
+
end
|
30
|
+
arg_value
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.fetch_value(arg_name, arg_type = :string)
|
35
|
+
new.fetch_value(arg_name, arg_type)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module ChefLicensing
|
2
|
+
class EnvFetcher
|
3
|
+
|
4
|
+
def initialize(env = ENV)
|
5
|
+
@env = env
|
6
|
+
end
|
7
|
+
|
8
|
+
def fetch_value(env_name, env_type = :string)
|
9
|
+
case env_type
|
10
|
+
when :boolean
|
11
|
+
@env.key?(env_name)
|
12
|
+
when :string
|
13
|
+
@env.fetch(env_name, nil)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.fetch_value(env_name, env_type = :string)
|
18
|
+
new.fetch_value(env_name, env_type)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|