wss_agent 0.0.25 → 0.0.26
Sign up to get free protection for your applications and to get access to all the features.
- 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
|