wss_agent 0.0.25 → 0.0.26
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/README.md +7 -0
- data/lib/wss_agent.rb +10 -2
- data/lib/wss_agent/cli.rb +1 -0
- data/lib/wss_agent/client.rb +11 -13
- data/lib/wss_agent/configure.rb +23 -20
- data/lib/wss_agent/project.rb +0 -1
- data/lib/wss_agent/response_inventory.rb +1 -1
- data/lib/wss_agent/response_policies.rb +1 -1
- data/lib/wss_agent/specifications.rb +29 -12
- data/lib/wss_agent/version.rb +1 -1
- data/spec/wss_agent/configure_spec.rb +18 -0
- data/spec/wss_agent/specifications_spec.rb +24 -6
- data/wss_agent.gemspec +3 -2
- metadata +26 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 37746ad31b6f21f4c7f708caa09fa025c3c7dfc2
|
4
|
+
data.tar.gz: 7296602265f771c66dfbda7d779609b28d8c0cbe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: affacdbb4903237066485beed2500020fa2861196425ea2e79a19e8f1bcaab29842910b8e3530f8d06af24ae804de2896e0fee0fa778784b5f5e33385f484499
|
7
|
+
data.tar.gz: 393b302d06d46a81947a4c389896cb0414352c8d04742969ab245aeda6cc7f91c6edae2834cd3a0482830c033f0cf61f3e59033d95d0c75ee1484181d615168e
|
data/README.md
CHANGED
@@ -47,6 +47,13 @@ Commands:
|
|
47
47
|
```bash
|
48
48
|
$ wss_agent update
|
49
49
|
```
|
50
|
+
|
51
|
+
###### force update
|
52
|
+
```bash
|
53
|
+
$ wss_agent update --force-update
|
54
|
+
```
|
55
|
+
or add 'force_update: true' to 'wss_agent.yml'
|
56
|
+
|
50
57
|
### 5) checking dependencies that they conforms with company policy.
|
51
58
|
```bash
|
52
59
|
$ wss_agent check_policies
|
data/lib/wss_agent.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'thor'
|
2
2
|
require 'net/http'
|
3
3
|
require 'awesome_print'
|
4
|
-
require '
|
4
|
+
require 'psych'
|
5
5
|
require 'multi_json'
|
6
6
|
require 'faraday'
|
7
7
|
require 'faraday_middleware'
|
@@ -21,6 +21,12 @@ module WssAgent
|
|
21
21
|
DEFAULT_CA_BUNDLE_PATH = File.dirname(__FILE__) + '/data/ca-certificates.crt'
|
22
22
|
|
23
23
|
class WssAgentError < StandardError
|
24
|
+
URL_INVALID = 'Api url is invalid. Could you please check url in wss_agent.yml'.freeze
|
25
|
+
CANNOT_FIND_TOKEN = "Can't find Token, please add your Whitesource API token in the wss_agent.yml file".freeze
|
26
|
+
CANNOT_FIND_URL = "Can't find the url, please add your Whitesource url destination in the wss_agent.yml file.".freeze
|
27
|
+
INVALID_CONFIG_FORMAT = 'Problem reading wss_agent.yml, please check the file is a valid YAML'.freeze
|
28
|
+
NOT_FOUND_CONFIGFILE = "Config file isn't exist. Could you please run 'wss_agent config' before.".freeze
|
29
|
+
|
24
30
|
def self.status_code(code)
|
25
31
|
define_method(:status_code) { code }
|
26
32
|
end
|
@@ -37,6 +43,8 @@ module WssAgent
|
|
37
43
|
end
|
38
44
|
|
39
45
|
def self.enable_debug!
|
40
|
-
@logger ||= Yell.new
|
46
|
+
@logger ||= Yell.new(
|
47
|
+
STDOUT, level: [:debug, :info, :warn, :error, :fatal, :unknown]
|
48
|
+
)
|
41
49
|
end
|
42
50
|
end
|
data/lib/wss_agent/cli.rb
CHANGED
@@ -29,6 +29,7 @@ module WssAgent
|
|
29
29
|
method_option :excludes, type: :string
|
30
30
|
method_option :verbose, aliases: '-v', desc: 'Be verbose'
|
31
31
|
method_option :force, type: :boolean, aliases: '-f', desc: 'Force Check All Dependencies'
|
32
|
+
method_option :'force-update', type: :boolean, desc: 'Force Update'
|
32
33
|
def update
|
33
34
|
WssAgent.enable_debug! if options['verbose']
|
34
35
|
result = Specifications.update(options)
|
data/lib/wss_agent/client.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
module WssAgent
|
2
|
+
# Client class
|
3
|
+
#
|
2
4
|
class Client
|
3
5
|
attr_accessor :connection
|
4
6
|
POLICY_TYPES = {
|
@@ -16,10 +18,8 @@ module WssAgent
|
|
16
18
|
h.request :url_encoded
|
17
19
|
h.adapter :excon
|
18
20
|
end
|
21
|
+
Excon.defaults[:ciphers] = 'DEFAULT' if defined?(JRuby)
|
19
22
|
|
20
|
-
if defined?(JRuby)
|
21
|
-
Excon.defaults[:ciphers] = 'DEFAULT'
|
22
|
-
end
|
23
23
|
@connection
|
24
24
|
end
|
25
25
|
|
@@ -52,7 +52,7 @@ module WssAgent
|
|
52
52
|
|
53
53
|
def check_policies(gem_list, options = {})
|
54
54
|
request_options =
|
55
|
-
if
|
55
|
+
if Configure['force_check_all_dependencies'] || options['force']
|
56
56
|
{ type: POLICY_TYPES[:compliance], forceCheckAllDependencies: true }
|
57
57
|
else
|
58
58
|
{ type: POLICY_TYPES[:basic], forceCheckAllDependencies: false }
|
@@ -64,7 +64,7 @@ module WssAgent
|
|
64
64
|
def request(gem_list, options = {})
|
65
65
|
WssAgent.logger.debug "request params: #{payload(gem_list, options)}"
|
66
66
|
|
67
|
-
connection.post(
|
67
|
+
connection.post(Configure.api_path, payload(gem_list, options))
|
68
68
|
rescue Faraday::Error::ClientError => ex
|
69
69
|
ex
|
70
70
|
end
|
@@ -74,18 +74,16 @@ module WssAgent
|
|
74
74
|
def connection_options
|
75
75
|
@connection_options ||
|
76
76
|
begin
|
77
|
-
|
78
77
|
@connection_options = {
|
79
|
-
url: Configure.url,
|
80
|
-
request: { timeout: REQUEST_TIMEOUT }
|
78
|
+
url: Configure.url, request: { timeout: REQUEST_TIMEOUT }
|
81
79
|
}
|
82
|
-
if Configure.ssl?
|
83
|
-
@connection_options[:ssl] = {
|
84
|
-
ca_file: WssAgent::DEFAULT_CA_BUNDLE_PATH
|
85
|
-
}
|
86
|
-
end
|
80
|
+
@connection_options[:ssl] = ssl_options if Configure.ssl?
|
87
81
|
end
|
88
82
|
@connection_options
|
89
83
|
end
|
84
|
+
|
85
|
+
def ssl_options
|
86
|
+
{ ca_file: WssAgent::DEFAULT_CA_BUNDLE_PATH }
|
87
|
+
end
|
90
88
|
end
|
91
89
|
end
|
data/lib/wss_agent/configure.rb
CHANGED
@@ -10,11 +10,16 @@ module WssAgent
|
|
10
10
|
|
11
11
|
class << self
|
12
12
|
def default_path
|
13
|
-
File.join(
|
13
|
+
File.join(
|
14
|
+
File.expand_path('../..', __FILE__), 'config', DEFAULT_CONFIG_FILE
|
15
|
+
)
|
14
16
|
end
|
15
17
|
|
16
18
|
def custom_default_path
|
17
|
-
File.join(
|
19
|
+
File.join(
|
20
|
+
File.expand_path('../..', __FILE__), 'config',
|
21
|
+
CUSTOM_DEFAULT_CONFIG_FILE
|
22
|
+
)
|
18
23
|
end
|
19
24
|
|
20
25
|
def exist_default_config?
|
@@ -22,7 +27,7 @@ module WssAgent
|
|
22
27
|
end
|
23
28
|
|
24
29
|
def default
|
25
|
-
exist_default_config? ?
|
30
|
+
exist_default_config? ? Psych.safe_load(File.read(default_path)) : {}
|
26
31
|
end
|
27
32
|
|
28
33
|
def current_path
|
@@ -31,13 +36,13 @@ module WssAgent
|
|
31
36
|
|
32
37
|
def current
|
33
38
|
unless File.exist?(current_path)
|
34
|
-
return raise NotFoundConfigFile,
|
39
|
+
return raise NotFoundConfigFile, WssAgentError::NOT_FOUND_CONFIGFILE
|
35
40
|
end
|
36
41
|
|
37
|
-
@current_config =
|
42
|
+
@current_config = Psych.safe_load(File.read(current_path))
|
38
43
|
|
39
|
-
unless
|
40
|
-
return raise InvalidConfigFile,
|
44
|
+
unless @current_config
|
45
|
+
return raise InvalidConfigFile, WssAgentError::INVALID_CONFIG_FORMAT
|
41
46
|
end
|
42
47
|
|
43
48
|
default.merge(@current_config)
|
@@ -46,12 +51,12 @@ module WssAgent
|
|
46
51
|
def uri
|
47
52
|
@url = current['url']
|
48
53
|
if @url.nil? || @url == ''
|
49
|
-
raise ApiUrlNotFound,
|
54
|
+
raise ApiUrlNotFound, WssAgentError::CANNOT_FIND_URL
|
50
55
|
end
|
51
56
|
URI(@url)
|
52
57
|
|
53
58
|
rescue URI::Error
|
54
|
-
raise ApiUrlInvalid,
|
59
|
+
raise ApiUrlInvalid, WssAgentError::URL_INVALID
|
55
60
|
end
|
56
61
|
|
57
62
|
def port
|
@@ -74,31 +79,29 @@ module WssAgent
|
|
74
79
|
end
|
75
80
|
|
76
81
|
def token
|
77
|
-
if current['token'].nil? || (current['token'] == '') ||
|
78
|
-
|
82
|
+
if current['token'].nil? || (current['token'] == '') ||
|
83
|
+
(current['token'] == default['token'])
|
84
|
+
raise TokenNotFound, WssAgentError::CANNOT_FIND_TOKEN
|
79
85
|
else
|
80
86
|
current['token']
|
81
87
|
end
|
82
88
|
end
|
83
89
|
|
90
|
+
def project_meta
|
91
|
+
@project_meta ||= WssAgent::Project.new
|
92
|
+
end
|
93
|
+
|
84
94
|
def coordinates
|
85
95
|
return {} unless current['project_token'].to_s.strip.empty?
|
86
|
-
|
87
|
-
project_meta = WssAgent::Project.new
|
88
|
-
|
89
96
|
coordinates_config = current['coordinates']
|
90
97
|
coordinates_artifact_id = coordinates_config['artifact_id']
|
91
98
|
coordinates_version = coordinates_config['version']
|
92
|
-
|
93
99
|
if coordinates_artifact_id.to_s.strip.empty?
|
94
100
|
coordinates_artifact_id = project_meta.project_name
|
95
101
|
coordinates_version = project_meta.project_version
|
96
102
|
end
|
97
|
-
|
98
|
-
|
99
|
-
'artifactId' => coordinates_artifact_id,
|
100
|
-
'version' => coordinates_version
|
101
|
-
}
|
103
|
+
{ 'artifactId' => coordinates_artifact_id,
|
104
|
+
'version' => coordinates_version }
|
102
105
|
end
|
103
106
|
end
|
104
107
|
end
|
data/lib/wss_agent/project.rb
CHANGED
@@ -16,7 +16,7 @@ module WssAgent
|
|
16
16
|
if data['updatedProjects'].empty?
|
17
17
|
@message << "\n No projects were updated \n"
|
18
18
|
else
|
19
|
-
@message << " #{data['updatedProjects'].size}
|
19
|
+
@message << " #{data['updatedProjects'].size} existing projects were updated: "
|
20
20
|
@message << data['updatedProjects'].join(' ')
|
21
21
|
end
|
22
22
|
|
@@ -28,7 +28,7 @@ module WssAgent
|
|
28
28
|
'List of violations:'
|
29
29
|
]
|
30
30
|
@message << policy_violations.each_with_index.map { |j, i|
|
31
|
-
"#{i+1}. Package: #{j['resource']['displayName']} - #{j['policy']['displayName']}"
|
31
|
+
"#{i + 1}. Package: #{j['resource']['displayName']} - #{j['policy']['displayName']}"
|
32
32
|
}.join("\n")
|
33
33
|
@message.join("\n")
|
34
34
|
else
|
@@ -42,24 +42,25 @@ module WssAgent
|
|
42
42
|
end
|
43
43
|
private :check_policy?
|
44
44
|
|
45
|
+
def force_update?(options = {})
|
46
|
+
options['force-update'] ||
|
47
|
+
WssAgent::Configure['force_update']
|
48
|
+
end
|
49
|
+
|
50
|
+
private :force_update?
|
51
|
+
|
45
52
|
# Send gem list to server
|
46
53
|
#
|
47
54
|
# @param (see Specifications#specs)
|
48
55
|
def update(options = {})
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
options
|
55
|
-
)
|
56
|
-
if policy_results.success? && policy_results.policy_violations?
|
57
|
-
puts policy_results.message
|
58
|
-
return Struct.new(:status) { def success?; status; end; }.new(false)
|
59
|
-
end
|
56
|
+
result = check_policies_for_update(options)
|
57
|
+
if !force_update?(options) && (result.status == :reject)
|
58
|
+
return Struct.new(:status) do
|
59
|
+
alias_method :success?, :status
|
60
|
+
end.new(false)
|
60
61
|
end
|
61
62
|
|
62
|
-
|
63
|
+
wss_client = WssAgent::Client.new
|
63
64
|
result = wss_client.update(WssAgent::Specifications.list(options))
|
64
65
|
if result.success?
|
65
66
|
WssAgent.logger.debug result.data
|
@@ -72,6 +73,22 @@ module WssAgent
|
|
72
73
|
result
|
73
74
|
end
|
74
75
|
|
76
|
+
# Check policies before update
|
77
|
+
#
|
78
|
+
# @param (see Specifications#specs)
|
79
|
+
def check_policies_for_update(options = {})
|
80
|
+
return Struct.new(:status).new(:ok) unless check_policy?(options)
|
81
|
+
wss_client = WssAgent::Client.new
|
82
|
+
policy_results = wss_client.check_policies(
|
83
|
+
WssAgent::Specifications.list(options), options
|
84
|
+
)
|
85
|
+
if policy_results.success? && policy_results.policy_violations?
|
86
|
+
puts policy_results.message
|
87
|
+
return Struct.new(:status, :msg).new(:reject, policy_results.message)
|
88
|
+
end
|
89
|
+
Struct.new(:status).new(:ok)
|
90
|
+
end
|
91
|
+
|
75
92
|
# checking dependencies that they conforms with company policy.
|
76
93
|
#
|
77
94
|
# @param (see Specifications#specs)
|
data/lib/wss_agent/version.rb
CHANGED
@@ -67,6 +67,24 @@ describe WssAgent::Configure do
|
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
|
+
describe '.force_update' do
|
71
|
+
it 'set value to false' do
|
72
|
+
expect(WssAgent::Configure['force_update']).to be_falsey
|
73
|
+
end
|
74
|
+
it 'set value to true' do
|
75
|
+
allow(
|
76
|
+
WssAgent::Configure
|
77
|
+
).to receive_messages(current: { 'force_update' => true })
|
78
|
+
expect(WssAgent::Configure['force_update']).to be_truthy
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'default value' do
|
82
|
+
it 'should be false' do
|
83
|
+
expect(WssAgent::Configure['force_update']).to be_falsey
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
70
88
|
describe '.url' do
|
71
89
|
context 'when url is empty' do
|
72
90
|
before do
|
@@ -18,6 +18,7 @@ describe WssAgent::Specifications, vcr: true do
|
|
18
18
|
}
|
19
19
|
]
|
20
20
|
}
|
21
|
+
let(:default_config) { WssAgent::Configure.default }
|
21
22
|
|
22
23
|
describe '.check_policies' do
|
23
24
|
let(:success_response) {
|
@@ -67,12 +68,10 @@ describe WssAgent::Specifications, vcr: true do
|
|
67
68
|
end
|
68
69
|
|
69
70
|
context 'when check_policies is true' do
|
70
|
-
|
71
|
-
before {
|
71
|
+
before do
|
72
72
|
allow(WssAgent::Client).to receive(:new).and_return(wss_client)
|
73
|
-
allow(WssAgent::Configure).to receive(:current)
|
74
|
-
|
75
|
-
}
|
73
|
+
allow(WssAgent::Configure).to receive(:current).and_return(default_config.merge('check_policies' => true))
|
74
|
+
end
|
76
75
|
context 'and check policies return a violation' do
|
77
76
|
it 'should not update inventory' do
|
78
77
|
allow(policy_success_response).to receive(:policy_violations?).and_return(true)
|
@@ -81,6 +80,25 @@ describe WssAgent::Specifications, vcr: true do
|
|
81
80
|
res = WssAgent::Specifications.update
|
82
81
|
expect(res.success?).to be false
|
83
82
|
end
|
83
|
+
context 'and force_update set true' do
|
84
|
+
before do
|
85
|
+
allow(WssAgent::Client).to receive(:new).and_return(wss_client)
|
86
|
+
allow(WssAgent::Configure).to receive(:current).and_return(
|
87
|
+
default_config.merge(
|
88
|
+
'check_policies' => true,
|
89
|
+
'force_update' => true
|
90
|
+
)
|
91
|
+
)
|
92
|
+
end
|
93
|
+
it 'should be update if update_force is true' do
|
94
|
+
allow(WssAgent::Specifications).to receive(:list).and_return(gem_list)
|
95
|
+
allow(policy_success_response).to receive(:policy_violations?).and_return(true)
|
96
|
+
expect(wss_client).to receive(:check_policies).and_return(policy_success_response)
|
97
|
+
expect(wss_client).to receive(:update).and_return(success_response)
|
98
|
+
res = WssAgent::Specifications.update
|
99
|
+
expect(res.success?).to be_truthy
|
100
|
+
end
|
101
|
+
end
|
84
102
|
end
|
85
103
|
|
86
104
|
context 'and check policies returns without a violation' do
|
@@ -100,7 +118,7 @@ describe WssAgent::Specifications, vcr: true do
|
|
100
118
|
before {
|
101
119
|
allow(WssAgent::Client).to receive(:new).and_return(wss_client)
|
102
120
|
allow(WssAgent::Configure).to receive(:current)
|
103
|
-
.and_return(
|
121
|
+
.and_return(default_config.merge({'check_policies' => false}))
|
104
122
|
}
|
105
123
|
it 'should update inventory' do
|
106
124
|
allow(WssAgent::Specifications).to receive(:list).and_return(gem_list)
|
data/wss_agent.gemspec
CHANGED
@@ -31,8 +31,9 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.add_dependency 'thor', '~> 0.19', '>= 0.19.1'
|
32
32
|
spec.add_dependency 'yell', '~> 2.0', '>= 2.0.5'
|
33
33
|
spec.add_dependency 'excon', '~> 0.45'
|
34
|
-
spec.add_dependency 'faraday', '~> 0.
|
35
|
-
spec.add_dependency 'faraday_middleware', '~> 0.
|
34
|
+
spec.add_dependency 'faraday', '~> 0.12'
|
35
|
+
spec.add_dependency 'faraday_middleware', '~> 0.11.0.1'
|
36
36
|
spec.add_dependency 'awesome_print', '~> 1.6', '>= 1.6.1'
|
37
37
|
spec.add_dependency 'multi_json', '~> 1.12', '>= 1.12.1'
|
38
|
+
spec.add_dependency 'psych', '~> 2.2', '>= 2.2.4'
|
38
39
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wss_agent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.26
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maxim Pechnikov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-04-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -188,34 +188,28 @@ dependencies:
|
|
188
188
|
requirements:
|
189
189
|
- - "~>"
|
190
190
|
- !ruby/object:Gem::Version
|
191
|
-
version: '0.
|
192
|
-
- - ">="
|
193
|
-
- !ruby/object:Gem::Version
|
194
|
-
version: 0.9.1
|
191
|
+
version: '0.12'
|
195
192
|
type: :runtime
|
196
193
|
prerelease: false
|
197
194
|
version_requirements: !ruby/object:Gem::Requirement
|
198
195
|
requirements:
|
199
196
|
- - "~>"
|
200
197
|
- !ruby/object:Gem::Version
|
201
|
-
version: '0.
|
202
|
-
- - ">="
|
203
|
-
- !ruby/object:Gem::Version
|
204
|
-
version: 0.9.1
|
198
|
+
version: '0.12'
|
205
199
|
- !ruby/object:Gem::Dependency
|
206
200
|
name: faraday_middleware
|
207
201
|
requirement: !ruby/object:Gem::Requirement
|
208
202
|
requirements:
|
209
203
|
- - "~>"
|
210
204
|
- !ruby/object:Gem::Version
|
211
|
-
version:
|
205
|
+
version: 0.11.0.1
|
212
206
|
type: :runtime
|
213
207
|
prerelease: false
|
214
208
|
version_requirements: !ruby/object:Gem::Requirement
|
215
209
|
requirements:
|
216
210
|
- - "~>"
|
217
211
|
- !ruby/object:Gem::Version
|
218
|
-
version:
|
212
|
+
version: 0.11.0.1
|
219
213
|
- !ruby/object:Gem::Dependency
|
220
214
|
name: awesome_print
|
221
215
|
requirement: !ruby/object:Gem::Requirement
|
@@ -256,6 +250,26 @@ dependencies:
|
|
256
250
|
- - ">="
|
257
251
|
- !ruby/object:Gem::Version
|
258
252
|
version: 1.12.1
|
253
|
+
- !ruby/object:Gem::Dependency
|
254
|
+
name: psych
|
255
|
+
requirement: !ruby/object:Gem::Requirement
|
256
|
+
requirements:
|
257
|
+
- - "~>"
|
258
|
+
- !ruby/object:Gem::Version
|
259
|
+
version: '2.2'
|
260
|
+
- - ">="
|
261
|
+
- !ruby/object:Gem::Version
|
262
|
+
version: 2.2.4
|
263
|
+
type: :runtime
|
264
|
+
prerelease: false
|
265
|
+
version_requirements: !ruby/object:Gem::Requirement
|
266
|
+
requirements:
|
267
|
+
- - "~>"
|
268
|
+
- !ruby/object:Gem::Version
|
269
|
+
version: '2.2'
|
270
|
+
- - ">="
|
271
|
+
- !ruby/object:Gem::Version
|
272
|
+
version: 2.2.4
|
259
273
|
description: White Source agent to sync gems
|
260
274
|
email:
|
261
275
|
- parallel588@gmail.com
|