inspec 1.42.3 → 1.43.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +36 -22
- data/docs/profiles.md +1 -1
- data/docs/resources/cpan.md.erb +62 -0
- data/docs/resources/cran.md.erb +54 -0
- data/docs/resources/elasticsearch.md.erb +245 -0
- data/docs/resources/shadow.md.erb +20 -6
- data/lib/bundles/inspec-compliance/README.md +13 -22
- data/lib/bundles/inspec-compliance/api.rb +13 -2
- data/lib/bundles/inspec-compliance/api/login.rb +150 -0
- data/lib/bundles/inspec-compliance/cli.rb +43 -157
- data/lib/bundles/inspec-compliance/target.rb +2 -3
- data/lib/inspec/objects/control.rb +10 -2
- data/lib/inspec/profile.rb +2 -1
- data/lib/inspec/resource.rb +3 -0
- data/lib/inspec/version.rb +1 -1
- data/lib/resources/cpan.rb +60 -0
- data/lib/resources/cran.rb +66 -0
- data/lib/resources/elasticsearch.rb +172 -0
- metadata +9 -2
@@ -29,17 +29,31 @@ A `shadow` resource block declares one (or more) users and associated user infor
|
|
29
29
|
its('users') { should_not include 'forbidden_user' }
|
30
30
|
end
|
31
31
|
|
32
|
+
or with a single query:
|
33
|
+
|
34
|
+
describe shadow.users('root') do
|
35
|
+
its('count') { should eq 1 }
|
36
|
+
end
|
37
|
+
|
32
38
|
or with a filter:
|
33
39
|
|
34
|
-
describe shadow.
|
35
|
-
its('users') { should cmp 'root' }
|
40
|
+
describe shadow.filter(min_days: '0', max_days: '99999') do
|
36
41
|
its('count') { should eq 1 }
|
37
42
|
end
|
38
43
|
|
39
|
-
|
44
|
+
The following properties are available:
|
45
|
+
|
46
|
+
* `users`
|
47
|
+
* `passwords`
|
48
|
+
* `last_changes`
|
49
|
+
* `min_days`
|
50
|
+
* `max_days`
|
51
|
+
* `warn_days`
|
52
|
+
* `inactive_days`
|
53
|
+
* `expiry_date`
|
54
|
+
* `reserved`
|
40
55
|
|
41
|
-
|
42
|
-
* `filter` one (or more) arguments, for example: `passwd.users(/name/)` used to define filtering; `filter` may take any of the following arguments: `count` (retrieves the number of entries), `lines` (provides raw `passwd` lines), and `params` (returns an array of maps for all entries)
|
56
|
+
Properties can be used as a single query or can be joined together with the `.filter` method.
|
43
57
|
|
44
58
|
<br>
|
45
59
|
|
@@ -72,7 +86,7 @@ The `count` matcher tests the number of times the named user appears in `/etc/sh
|
|
72
86
|
|
73
87
|
its('count') { should eq 1 }
|
74
88
|
|
75
|
-
|
89
|
+
This matcher is best used in conjunction with filters. For example:
|
76
90
|
|
77
91
|
describe shadow.users('dannos') do
|
78
92
|
its('count') { should eq 1 }
|
@@ -2,18 +2,17 @@
|
|
2
2
|
|
3
3
|
This extensions offers the following features:
|
4
4
|
|
5
|
-
- list available profiles in Chef Compliance
|
6
|
-
- execute profiles directly from Chef Compliance locally
|
7
|
-
- upload a local profile to Chef Compliance
|
5
|
+
- list available profiles in Chef Automate/Chef Compliance
|
6
|
+
- execute profiles directly from Chef Automate/Chef Compliance locally
|
7
|
+
- upload a local profile to Chef Automate/Chef Compliance
|
8
8
|
|
9
9
|
To use the CLI, this InSpec add-on adds the following commands:
|
10
10
|
|
11
|
-
* `$ inspec compliance login` - authentication of the API token against Chef Compliance
|
12
|
-
* `$ inspec compliance
|
13
|
-
* `$ inspec compliance
|
14
|
-
* `$ inspec
|
15
|
-
* `$ inspec compliance
|
16
|
-
* `$ inspec compliance logout` - logout of Chef Compliance
|
11
|
+
* `$ inspec compliance login` - authentication of the API token against Chef Automate/Chef Compliance
|
12
|
+
* `$ inspec compliance profiles` - list all available Compliance profiles
|
13
|
+
* `$ inspec exec compliance://profile` - runs a Compliance profile
|
14
|
+
* `$ inspec compliance upload path/to/local/profile` - uploads a local profile to Chef Automate/Chef Compliance
|
15
|
+
* `$ inspec compliance logout` - logout of Chef Automate/Chef Compliance
|
17
16
|
|
18
17
|
Compliance profiles can be executed in two mays:
|
19
18
|
|
@@ -31,8 +30,7 @@ Commands:
|
|
31
30
|
inspec compliance download PROFILE # downloads a profile from Chef Compliance
|
32
31
|
inspec compliance exec PROFILE # executes a Chef Compliance profile
|
33
32
|
inspec compliance help [COMMAND] # Describe subcommands or one specific subcommand
|
34
|
-
inspec compliance login SERVER # Log in to a Chef Compliance SERVER
|
35
|
-
inspec compliance login_automate SERVER # Log in to an Automate SERVER
|
33
|
+
inspec compliance login SERVER # Log in to a Chef Automate/Chef Compliance SERVER
|
36
34
|
inspec compliance logout # user logout from Chef Compliance
|
37
35
|
inspec compliance profiles # list all available profiles in Chef Compliance
|
38
36
|
inspec compliance upload PATH # uploads a local profile to Chef Compliance
|
@@ -41,29 +39,22 @@ Commands:
|
|
41
39
|
|
42
40
|
### Login with Chef Automate
|
43
41
|
|
44
|
-
You need
|
45
|
-
|
46
|
-
Now, you need a user token. You can retrieve that via [UI](https://docs.chef.io/api_delivery.html) or [CLI](https://docs.chef.io/ctl_delivery.html#delivery-token).
|
42
|
+
You will need an access token for authentication. You can retrieve one via [UI](https://docs.chef.io/api_delivery.html) or [CLI](https://docs.chef.io/ctl_delivery.html#delivery-token).
|
47
43
|
|
48
44
|
```
|
49
|
-
inspec compliance
|
45
|
+
$ inspec compliance login https://automate.compliance.test --insecure --user 'admin' --ent 'brewinc' --token 'zuop..._KzE'
|
50
46
|
```
|
51
47
|
|
52
48
|
### Login with Chef Compliance
|
53
49
|
|
54
|
-
|
50
|
+
You will need an access token for authentication. You can retrieve one via:
|
55
51
|
|
56
52
|
![Chef Compliance Token](images/cc-token.png)
|
57
53
|
|
58
54
|
You can choose the access token (`--token`) or the refresh token (`--refresh_token`)
|
59
55
|
|
60
56
|
```
|
61
|
-
# login to chef compliance server
|
62
57
|
$ inspec compliance login https://compliance.test --user admin --insecure --token '...'
|
63
|
-
|
64
|
-
# display the chef compliance server version
|
65
|
-
$ inspec compliance version
|
66
|
-
Chef Compliance version: 1.0.11
|
67
58
|
```
|
68
59
|
|
69
60
|
### List available profiles via Chef Compliance / Automate
|
@@ -131,7 +122,7 @@ Available profiles:
|
|
131
122
|
* cis/cis-ubuntu14.04lts-level2
|
132
123
|
```
|
133
124
|
|
134
|
-
### Run a profile from Chef Compliance / Automate on Workstation
|
125
|
+
### Run a profile from Chef Compliance / Chef Automate on Workstation
|
135
126
|
|
136
127
|
```
|
137
128
|
$ inspec exec compliance://admin/profile
|
@@ -5,13 +5,16 @@
|
|
5
5
|
require 'net/http'
|
6
6
|
require 'uri'
|
7
7
|
|
8
|
+
require_relative 'api/login'
|
9
|
+
|
8
10
|
module Compliance
|
9
|
-
class ServerConfigurationMissing < StandardError
|
10
|
-
end
|
11
|
+
class ServerConfigurationMissing < StandardError; end
|
11
12
|
|
12
13
|
# API Implementation does not hold any state by itself,
|
13
14
|
# everything will be stored in local Configuration store
|
14
15
|
class API # rubocop:disable Metrics/ClassLength
|
16
|
+
extend Compliance::API::Login
|
17
|
+
|
15
18
|
# return all compliance profiles available for the user
|
16
19
|
def self.profiles(config)
|
17
20
|
# Chef Compliance
|
@@ -238,5 +241,13 @@ module Compliance
|
|
238
241
|
return nil unless config['version'].is_a?(Hash)
|
239
242
|
config['version']['version']
|
240
243
|
end
|
244
|
+
|
245
|
+
def self.determine_server_type(url, insecure)
|
246
|
+
if Compliance::HTTP.get(url + '/compliance/version', nil, insecure).code == '401'
|
247
|
+
:automate
|
248
|
+
elsif Compliance::HTTP.get(url + '/api/version', nil, insecure).code == '200'
|
249
|
+
:compliance
|
250
|
+
end
|
251
|
+
end
|
241
252
|
end
|
242
253
|
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# author: Christoph Hartmann
|
3
|
+
# author: Dominik Ricter
|
4
|
+
# author: Jerry Aldrich
|
5
|
+
|
6
|
+
module Compliance
|
7
|
+
class API
|
8
|
+
module Login
|
9
|
+
class CannotDetermineServerType < StandardError; end
|
10
|
+
|
11
|
+
def login(options)
|
12
|
+
raise ArgumentError, 'Please specify a server using `inspec compliance login https://SERVER`' unless options['server']
|
13
|
+
|
14
|
+
options['server_type'] = Compliance::API.determine_server_type(options['server'], options['insecure'])
|
15
|
+
|
16
|
+
case options['server_type']
|
17
|
+
when :automate
|
18
|
+
config = Login::AutomateServer.login(options)
|
19
|
+
when :compliance
|
20
|
+
config = Login::ComplianceServer.login(options)
|
21
|
+
else
|
22
|
+
raise CannotDetermineServerType, "Unable to determine if #{options['server']} is a Chef Automate or Chef Compliance server"
|
23
|
+
end
|
24
|
+
|
25
|
+
puts "Stored configuration for Chef #{config['server_type'].capitalize}: #{config['server']}' with user: '#{config['user']}'"
|
26
|
+
end
|
27
|
+
|
28
|
+
module AutomateServer
|
29
|
+
def self.login(options)
|
30
|
+
verify_thor_options(options)
|
31
|
+
|
32
|
+
options['url'] = options['server'] + '/compliance'
|
33
|
+
token = options['dctoken'] || options['token']
|
34
|
+
store_access_token(options, token)
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.store_access_token(options, token)
|
38
|
+
token_type = if options['token']
|
39
|
+
'usertoken'
|
40
|
+
else
|
41
|
+
'dctoken'
|
42
|
+
end
|
43
|
+
|
44
|
+
config = Compliance::Configuration.new
|
45
|
+
|
46
|
+
config.clean
|
47
|
+
|
48
|
+
config['automate'] = {}
|
49
|
+
config['automate']['ent'] = options['ent']
|
50
|
+
config['automate']['token_type'] = token_type
|
51
|
+
config['server'] = options['url']
|
52
|
+
config['user'] = options['user']
|
53
|
+
config['insecure'] = options['insecure'] || false
|
54
|
+
config['server_type'] = options['server_type'].to_s
|
55
|
+
config['token'] = token
|
56
|
+
config['version'] = Compliance::API.version(config)
|
57
|
+
|
58
|
+
config.store
|
59
|
+
config
|
60
|
+
end
|
61
|
+
|
62
|
+
# Automate login requires `--ent`, `--user`, and either `--token` or `--dctoken`
|
63
|
+
def self.verify_thor_options(o)
|
64
|
+
error_msg = []
|
65
|
+
|
66
|
+
error_msg.push('Please specify a user using `--user=\'USER\'`') if o['user'].nil?
|
67
|
+
error_msg.push('Please specify an enterprise using `--ent=\'automate\'`') if o['ent'].nil?
|
68
|
+
|
69
|
+
if o['token'].nil? && o['dctoken'].nil?
|
70
|
+
error_msg.push('Please specify a token using `--token=\'AUTOMATE_TOKEN\'` or `--dctoken=\'DATA_COLLECTOR_TOKEN\'`')
|
71
|
+
end
|
72
|
+
|
73
|
+
raise ArgumentError, error_msg.join("\n") unless error_msg.empty?
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
module ComplianceServer
|
78
|
+
def self.login(options)
|
79
|
+
compliance_verify_thor_options(options)
|
80
|
+
|
81
|
+
options['url'] = options['server'] + '/api'
|
82
|
+
|
83
|
+
if options['user'] && options['token']
|
84
|
+
compliance_store_access_token(options, options['token'])
|
85
|
+
elsif options['user'] && options['password']
|
86
|
+
compliance_login_user_pass(options)
|
87
|
+
elsif options['refresh_token']
|
88
|
+
compliance_login_refresh_token(options)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.compliance_login_user_pass(options)
|
93
|
+
success, msg, token = Compliance::API.get_token_via_password(
|
94
|
+
options['url'],
|
95
|
+
options['user'],
|
96
|
+
options['password'],
|
97
|
+
options['insecure'],
|
98
|
+
)
|
99
|
+
|
100
|
+
raise msg unless success
|
101
|
+
compliance_store_access_token(options, token)
|
102
|
+
end
|
103
|
+
|
104
|
+
def self.compliance_login_refresh_token(options)
|
105
|
+
success, msg, token = Compliance::API.get_token_via_refresh_token(
|
106
|
+
options['url'],
|
107
|
+
options['refresh_token'],
|
108
|
+
options['insecure'],
|
109
|
+
)
|
110
|
+
|
111
|
+
raise msg unless success
|
112
|
+
compliance_store_access_token(options, token)
|
113
|
+
end
|
114
|
+
|
115
|
+
def self.compliance_store_access_token(options, token)
|
116
|
+
config = Compliance::Configuration.new
|
117
|
+
config.clean
|
118
|
+
|
119
|
+
config['user'] = options['user'] if options['user']
|
120
|
+
config['server'] = options['url']
|
121
|
+
config['insecure'] = options['insecure'] || false
|
122
|
+
config['server_type'] = options['server_type'].to_s
|
123
|
+
config['token'] = token
|
124
|
+
config['version'] = Compliance::API.version(config)
|
125
|
+
|
126
|
+
config.store
|
127
|
+
config
|
128
|
+
end
|
129
|
+
|
130
|
+
# Compliance login requires `--user` or `--refresh_token`
|
131
|
+
# If `--user` then either `--password`, `--token`, or `--refresh-token`, is required
|
132
|
+
def self.compliance_verify_thor_options(o)
|
133
|
+
error_msg = []
|
134
|
+
|
135
|
+
error_msg.push('Please specify a server using `inspec compliance login https://SERVER`') if o['server'].nil?
|
136
|
+
|
137
|
+
if o['user'].nil? && o['refresh_token'].nil?
|
138
|
+
error_msg.push('Please specify a `--user=\'USER\'` or a `--refresh-token=\'TOKEN\'`')
|
139
|
+
end
|
140
|
+
|
141
|
+
if o['user'] && o['password'].nil? && o['token'].nil? && o['refresh_token'].nil?
|
142
|
+
error_msg.push('Please specify either a `--password`, `--token`, or `--refresh-token`')
|
143
|
+
end
|
144
|
+
|
145
|
+
raise ArgumentError, error_msg.join("\n") unless error_msg.empty?
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
@@ -18,78 +18,64 @@ module Compliance
|
|
18
18
|
namespace
|
19
19
|
end
|
20
20
|
|
21
|
-
desc "login SERVER --insecure --user='USER' --token='TOKEN'", 'Log in to a Chef Compliance SERVER'
|
21
|
+
desc "login https://SERVER --insecure --user='USER' --ent='ENTERPRISE' --token='TOKEN'", 'Log in to a Chef Compliance/Chef Automate SERVER'
|
22
|
+
long_desc <<-LONGDESC
|
23
|
+
`login` allows you to use InSpec with Chef Automate or a Chef Compliance Server
|
24
|
+
|
25
|
+
You need to a token for communication. More information about token retrieval
|
26
|
+
is available at:
|
27
|
+
https://docs.chef.io/api_automate.html#authentication-methods
|
28
|
+
https://docs.chef.io/api_compliance.html#obtaining-an-api-token
|
29
|
+
LONGDESC
|
22
30
|
option :insecure, aliases: :k, type: :boolean,
|
23
31
|
desc: 'Explicitly allows InSpec to perform "insecure" SSL connections and transfers'
|
24
32
|
option :user, type: :string, required: false,
|
25
|
-
desc: '
|
33
|
+
desc: 'Username'
|
26
34
|
option :password, type: :string, required: false,
|
27
|
-
desc: 'Chef Compliance
|
28
|
-
option :apipath, type: :string, default: '/api',
|
29
|
-
desc: 'Set the path to the API, defaults to /api'
|
35
|
+
desc: 'Password (Chef Compliance Only)'
|
30
36
|
option :token, type: :string, required: false,
|
31
|
-
desc: '
|
37
|
+
desc: 'Access token'
|
32
38
|
option :refresh_token, type: :string, required: false,
|
33
|
-
desc: 'Chef Compliance refresh token'
|
34
|
-
|
35
|
-
|
36
|
-
|
39
|
+
desc: 'Chef Compliance refresh token (Chef Compliance Only)'
|
40
|
+
option :dctoken, type: :string, required: false,
|
41
|
+
desc: 'Data Collector token (Chef Automate Only)'
|
42
|
+
option :ent, type: :string, required: false,
|
43
|
+
desc: 'Enterprise for Chef Automate reporting (Chef Automate Only)'
|
44
|
+
def login(server)
|
37
45
|
options['server'] = server
|
38
|
-
|
39
|
-
|
40
|
-
if !options['user'].nil? && !options['password'].nil?
|
41
|
-
# username / password
|
42
|
-
_success, msg = login_username_password(url, options['user'], options['password'], options['insecure'])
|
43
|
-
elsif !options['user'].nil? && !options['token'].nil?
|
44
|
-
# access token
|
45
|
-
_success, msg = store_access_token(url, options['user'], options['token'], options['insecure'])
|
46
|
-
elsif !options['refresh_token'].nil? && !options['user'].nil?
|
47
|
-
# refresh token
|
48
|
-
_success, msg = store_refresh_token(url, options['refresh_token'], true, options['user'], options['insecure'])
|
49
|
-
# TODO: we should login with the refreshtoken here
|
50
|
-
elsif !options['refresh_token'].nil?
|
51
|
-
_success, msg = login_refreshtoken(url, options)
|
52
|
-
else
|
53
|
-
puts 'Please run `inspec compliance login SERVER` with options --token or --refresh_token, --user, and --insecure or --not-insecure'
|
54
|
-
exit 1
|
55
|
-
end
|
56
|
-
|
57
|
-
puts '', msg
|
46
|
+
Compliance::API.login(options)
|
58
47
|
end
|
59
48
|
|
60
|
-
desc "login_automate SERVER --insecure --user='USER' --ent='
|
49
|
+
desc "login_automate https://SERVER --insecure --user='USER' --ent='ENTERPRISE' --usertoken='TOKEN'", 'Log in to a Chef Automate SERVER (DEPRECATED: Please use `login`)'
|
61
50
|
long_desc <<-LONGDESC
|
62
|
-
|
51
|
+
This commmand is deprecated and will be removed, please use `--login`.
|
52
|
+
|
53
|
+
`login_automate` allows you to use InSpec with Chef Automate.
|
63
54
|
|
64
|
-
You need to a
|
65
|
-
|
66
|
-
|
55
|
+
You need to a token for communication. More information about token retrieval
|
56
|
+
is available at:
|
57
|
+
https://docs.chef.io/api_automate.html#authentication-methods
|
58
|
+
https://docs.chef.io/api_compliance.html#obtaining-an-api-token
|
67
59
|
LONGDESC
|
68
|
-
option :dctoken, type: :string,
|
69
|
-
desc: 'Data Collector token'
|
70
|
-
option :usertoken, type: :string,
|
71
|
-
desc: 'Automate user token'
|
72
|
-
option :user, type: :string,
|
73
|
-
desc: 'Automate username'
|
74
|
-
option :ent, type: :string,
|
75
|
-
desc: 'Enterprise for Chef Automate reporting'
|
76
60
|
option :insecure, aliases: :k, type: :boolean,
|
77
61
|
desc: 'Explicitly allows InSpec to perform "insecure" SSL connections and transfers'
|
78
|
-
|
62
|
+
option :user, type: :string, required: true,
|
63
|
+
desc: 'Username'
|
64
|
+
option :usertoken, type: :string, required: false,
|
65
|
+
desc: 'Access token (DEPRECATED: Please use `--token`)'
|
66
|
+
option :token, type: :string, required: false,
|
67
|
+
desc: 'Access token'
|
68
|
+
option :dctoken, type: :string, required: false,
|
69
|
+
desc: 'Data Collector token'
|
70
|
+
option :ent, type: :string, required: true,
|
71
|
+
desc: 'Enterprise for Chef Automate reporting'
|
72
|
+
def login_automate(server)
|
73
|
+
warn '[DEPRECATION] `inspec compliance login_automate` is deprecated. Please use `inspec compliance login`'
|
79
74
|
options['server'] = server
|
80
|
-
url = options['server'] + '/compliance'
|
81
75
|
|
82
|
-
|
83
|
-
msg = login_automate_config(url, options['user'], options['dctoken'], options['usertoken'], options['ent'], options['insecure'])
|
84
|
-
puts '', msg
|
85
|
-
exit 0
|
86
|
-
end
|
76
|
+
options['token'] = options['usertoken'] if options['usertoken']
|
87
77
|
|
88
|
-
|
89
|
-
puts 'Please specify an user using `--user \'USER\'`' if options['user'].nil?
|
90
|
-
puts 'Please specify an enterprise using `--ent \'cd\'`' if options['ent'].nil?
|
91
|
-
puts 'Please specify a token using `--usertoken=\'AUTOMATE_TOKEN\'`' if options['usertoken'].nil? && options['dctoken'].nil?
|
92
|
-
exit 1
|
78
|
+
Compliance::API.login(options)
|
93
79
|
end
|
94
80
|
|
95
81
|
desc 'profiles', 'list all available profiles in Chef Compliance'
|
@@ -111,7 +97,7 @@ module Compliance
|
|
111
97
|
exit 1
|
112
98
|
end
|
113
99
|
rescue Compliance::ServerConfigurationMissing
|
114
|
-
puts "\nServer configuration information is missing. Please login using `inspec compliance login`"
|
100
|
+
STDERR.puts "\nServer configuration information is missing. Please login using `inspec compliance login`"
|
115
101
|
exit 1
|
116
102
|
end
|
117
103
|
|
@@ -272,109 +258,9 @@ module Compliance
|
|
272
258
|
|
273
259
|
private
|
274
260
|
|
275
|
-
def login_automate_config(url, user, dctoken, usertoken, ent, insecure) # rubocop:disable Metrics/ParameterLists
|
276
|
-
config = Compliance::Configuration.new
|
277
|
-
config.clean
|
278
|
-
config['user'] = user
|
279
|
-
config['server'] = url
|
280
|
-
config['automate'] = {}
|
281
|
-
config['automate']['ent'] = ent
|
282
|
-
config['server_type'] = 'automate'
|
283
|
-
config['insecure'] = insecure
|
284
|
-
|
285
|
-
# determine token method being used
|
286
|
-
if !dctoken.nil?
|
287
|
-
config['token'] = dctoken
|
288
|
-
token_type = 'dctoken'
|
289
|
-
token_msg = 'data collector token'
|
290
|
-
else
|
291
|
-
config['token'] = usertoken
|
292
|
-
token_type = 'usertoken'
|
293
|
-
token_msg = 'automate user token'
|
294
|
-
end
|
295
|
-
config['automate']['token_type'] = token_type
|
296
|
-
config['version'] = Compliance::API.version(config)
|
297
|
-
config.store
|
298
|
-
msg = "Stored configuration for Chef Automate: '#{url}' with user: '#{user}', ent: '#{ent}' and your #{token_msg}"
|
299
|
-
msg
|
300
|
-
end
|
301
|
-
|
302
|
-
def login_refreshtoken(url, options)
|
303
|
-
success, msg, _access_token = Compliance::API.get_token_via_refresh_token(url, options['refresh_token'], options['insecure'])
|
304
|
-
if success
|
305
|
-
config = Compliance::Configuration.new
|
306
|
-
config.clean
|
307
|
-
config['server'] = url
|
308
|
-
config['insecure'] = options['insecure']
|
309
|
-
config['server_type'] = 'compliance'
|
310
|
-
config['version'] = Compliance::API.version(config)
|
311
|
-
config.store
|
312
|
-
end
|
313
|
-
|
314
|
-
[success, msg]
|
315
|
-
end
|
316
|
-
|
317
|
-
def login_username_password(url, username, password, insecure)
|
318
|
-
config = Compliance::Configuration.new
|
319
|
-
config.clean
|
320
|
-
success, msg, api_token = Compliance::API.get_token_via_password(url, username, password, insecure)
|
321
|
-
if success
|
322
|
-
config['server'] = url
|
323
|
-
config['user'] = username
|
324
|
-
config['token'] = api_token
|
325
|
-
config['insecure'] = insecure
|
326
|
-
config['server_type'] = 'compliance'
|
327
|
-
config['version'] = Compliance::API.version(config)
|
328
|
-
config.store
|
329
|
-
success = true
|
330
|
-
end
|
331
|
-
[success, msg]
|
332
|
-
end
|
333
|
-
|
334
|
-
# saves a user access token (limited time)
|
335
|
-
def store_access_token(url, user, token, insecure)
|
336
|
-
config = Compliance::Configuration.new
|
337
|
-
config.clean
|
338
|
-
config['server'] = url
|
339
|
-
config['insecure'] = insecure
|
340
|
-
config['user'] = user
|
341
|
-
config['token'] = token
|
342
|
-
config['server_type'] = 'compliance'
|
343
|
-
config['version'] = Compliance::API.version(config)
|
344
|
-
config.store
|
345
|
-
|
346
|
-
[true, 'API access token stored']
|
347
|
-
end
|
348
|
-
|
349
|
-
# saves a refresh token supplied by the user
|
350
|
-
def store_refresh_token(url, refresh_token, verify, user, insecure)
|
351
|
-
config = Compliance::Configuration.new
|
352
|
-
config.clean
|
353
|
-
config['server'] = url
|
354
|
-
config['refresh_token'] = refresh_token
|
355
|
-
config['user'] = user
|
356
|
-
config['insecure'] = insecure
|
357
|
-
config['server_type'] = 'compliance'
|
358
|
-
config['version'] = Compliance::API.version(config)
|
359
|
-
|
360
|
-
if !verify
|
361
|
-
config.store
|
362
|
-
success = true
|
363
|
-
msg = 'API refresh token stored'
|
364
|
-
else
|
365
|
-
success, msg, _access_token= Compliance::API.get_token_via_refresh_token(url, refresh_token, insecure)
|
366
|
-
if success
|
367
|
-
config.store
|
368
|
-
msg = 'API access token verified'
|
369
|
-
end
|
370
|
-
end
|
371
|
-
|
372
|
-
[success, msg]
|
373
|
-
end
|
374
|
-
|
375
261
|
def loggedin(config)
|
376
262
|
serverknown = !config['server'].nil?
|
377
|
-
puts 'You need to login first with `inspec compliance login`
|
263
|
+
puts 'You need to login first with `inspec compliance login`' if !serverknown
|
378
264
|
serverknown
|
379
265
|
end
|
380
266
|
end
|