nexus_cli 1.0.2 → 2.0.0
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.
- data/.gitignore +4 -1
- data/.travis.yml +5 -0
- data/Gemfile +40 -0
- data/Guardfile +27 -0
- data/README.md +20 -23
- data/Thorfile +66 -0
- data/VERSION +1 -1
- data/{pro → features/pro}/nexus_custom_metadata.feature +0 -0
- data/{pro → features/pro}/nexus_pro.feature +0 -0
- data/features/support/env.rb +41 -32
- data/lib/nexus_cli.rb +26 -10
- data/lib/nexus_cli/base_remote.rb +32 -0
- data/lib/nexus_cli/configuration.rb +24 -5
- data/lib/nexus_cli/connection.rb +81 -0
- data/lib/nexus_cli/mixins/artifact_actions.rb +186 -0
- data/lib/nexus_cli/mixins/global_settings_actions.rb +64 -0
- data/lib/nexus_cli/mixins/logging_actions.rb +45 -0
- data/lib/nexus_cli/{nexus_pro_remote.rb → mixins/pro/custom_metadata_actions.rb} +5 -199
- data/lib/nexus_cli/mixins/pro/smart_proxy_actions.rb +214 -0
- data/lib/nexus_cli/mixins/repository_actions.rb +245 -0
- data/lib/nexus_cli/mixins/user_actions.rb +125 -0
- data/lib/nexus_cli/remote/oss_remote.rb +11 -0
- data/lib/nexus_cli/remote/pro_remote.rb +59 -0
- data/lib/nexus_cli/remote_factory.rb +24 -0
- data/lib/nexus_cli/tasks.rb +3 -3
- data/spec/fixtures/nexus.config +4 -0
- data/spec/spec_helper.rb +14 -2
- data/spec/{configuration_spec.rb → unit/nexus_cli/configuration_spec.rb} +0 -0
- data/spec/{oss_remote_spec.rb → unit/nexus_cli/oss_remote_spec.rb} +15 -5
- data/spec/{pro_remote_spec.rb → unit/nexus_cli/pro_remote_spec.rb} +6 -1
- metadata +32 -17
- data/Gemfile.lock +0 -65
- data/lib/nexus_cli/kernel.rb +0 -33
- data/lib/nexus_cli/nexus_oss_remote.rb +0 -636
- data/lib/nexus_cli/nexus_remote_factory.rb +0 -65
@@ -0,0 +1,81 @@
|
|
1
|
+
module NexusCli
|
2
|
+
class Connection
|
3
|
+
attr_reader :nexus
|
4
|
+
attr_reader :configuration
|
5
|
+
attr_reader :ssl_verify
|
6
|
+
|
7
|
+
def initialize(configuration, ssl_verify)
|
8
|
+
@configuration = configuration
|
9
|
+
@ssl_verify = ssl_verify
|
10
|
+
@nexus = setup_nexus(configuration)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Returns an HTTPClient instance with settings to connect
|
14
|
+
# to a Nexus server.
|
15
|
+
#
|
16
|
+
# @return [HTTPClient]
|
17
|
+
def setup_nexus(configuration)
|
18
|
+
client = HTTPClient.new
|
19
|
+
client.send_timeout = 6000
|
20
|
+
client.receive_timeout = 6000
|
21
|
+
# https://github.com/nahi/httpclient/issues/63
|
22
|
+
client.set_auth(nil, configuration['username'], configuration['password'])
|
23
|
+
client.www_auth.basic_auth.challenge(configuration['url'])
|
24
|
+
client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE unless ssl_verify
|
25
|
+
|
26
|
+
client
|
27
|
+
end
|
28
|
+
|
29
|
+
# Joins a given url to the current url stored in the configuraiton
|
30
|
+
# and returns the combined String.
|
31
|
+
#
|
32
|
+
# @param [String] url
|
33
|
+
#
|
34
|
+
# @return [String]
|
35
|
+
def nexus_url(url)
|
36
|
+
File.join(configuration['url'], url)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Gets that current status of the Nexus server. On a non-error
|
40
|
+
# status code, returns a Hash of values from the server.
|
41
|
+
#
|
42
|
+
# @return [Hash]
|
43
|
+
def status
|
44
|
+
response = nexus.get(nexus_url("service/local/status"))
|
45
|
+
case response.status
|
46
|
+
when 200
|
47
|
+
doc = Nokogiri::XML(response.content).xpath("/status/data")
|
48
|
+
data = Hash.new
|
49
|
+
data['app_name'] = doc.xpath("appName")[0].text
|
50
|
+
data['version'] = doc.xpath("version")[0].text
|
51
|
+
data['edition_long'] = doc.xpath("editionLong")[0].text
|
52
|
+
data['state'] = doc.xpath("state")[0].text
|
53
|
+
data['started_at'] = doc.xpath("startedAt")[0].text
|
54
|
+
data['base_url'] = doc.xpath("baseUrl")[0].text
|
55
|
+
return data
|
56
|
+
when 401
|
57
|
+
raise PermissionsException
|
58
|
+
when 503
|
59
|
+
raise CouldNotConnectToNexusException
|
60
|
+
else
|
61
|
+
raise UnexpectedStatusCodeException.new(response.status)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Transforms a given [String] into a sanitized version by
|
66
|
+
# replacing spaces with underscores and downcasing.
|
67
|
+
#
|
68
|
+
# @param unsanitized_string [String] the String to sanitize
|
69
|
+
#
|
70
|
+
# @return [String] the sanitized String
|
71
|
+
def sanitize_for_id(unsanitized_string)
|
72
|
+
unsanitized_string.gsub(" ", "_").downcase
|
73
|
+
end
|
74
|
+
|
75
|
+
# Determines whether or not the Nexus server being
|
76
|
+
# connected to is running Nexus Pro.
|
77
|
+
def running_nexus_pro?
|
78
|
+
status['edition_long'] == "Professional"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,186 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require 'tempfile'
|
3
|
+
|
4
|
+
module NexusCli
|
5
|
+
# @author Kyle Allan <kallan@riotgames.com>
|
6
|
+
module ArtifactActions
|
7
|
+
|
8
|
+
# Retrieves a file from the Nexus server using the given [String] artifact
|
9
|
+
# identifier. Optionally provide a destination [String].
|
10
|
+
#
|
11
|
+
# @param [String] artifact
|
12
|
+
# @param [String] destination
|
13
|
+
#
|
14
|
+
# @return [Hash] Some information about the artifact that was pulled.
|
15
|
+
def pull_artifact(artifact, destination=nil)
|
16
|
+
group_id, artifact_id, version, extension = parse_artifact_string(artifact)
|
17
|
+
version = Nokogiri::XML(get_artifact_info(artifact)).xpath("//version").first.content() if version.casecmp("latest")
|
18
|
+
file_name = "#{artifact_id}-#{version}.#{extension}"
|
19
|
+
destination = File.join(File.expand_path(destination || "."), file_name)
|
20
|
+
response = nexus.get(nexus_url("service/local/artifact/maven/redirect"), :query => {:g => group_id, :a => artifact_id, :v => version, :e => extension, :r => configuration['repository']})
|
21
|
+
case response.status
|
22
|
+
when 301, 307
|
23
|
+
# Follow redirect and stream in chunks.
|
24
|
+
artifact_file = File.open(destination, "wb") do |io|
|
25
|
+
nexus.get(response.content.gsub(/If you are not automatically redirected use this url: /, "")) do |chunk|
|
26
|
+
io.write(chunk)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
when 404
|
30
|
+
raise ArtifactNotFoundException
|
31
|
+
else
|
32
|
+
raise UnexpectedStatusCodeException.new(response.status)
|
33
|
+
end
|
34
|
+
{
|
35
|
+
:file_name => file_name,
|
36
|
+
:file_path => File.expand_path(destination),
|
37
|
+
:version => version,
|
38
|
+
:size => File.size(File.expand_path(destination))
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
# Pushes the given [file] to the Nexus server
|
43
|
+
# under the given [artifact] identifier.
|
44
|
+
#
|
45
|
+
# @param artifact [String] the Maven identifier
|
46
|
+
# @param file [type] the path to the file
|
47
|
+
#
|
48
|
+
# @return [Boolean] returns true when successful
|
49
|
+
def push_artifact(artifact, file)
|
50
|
+
group_id, artifact_id, version, extension = parse_artifact_string(artifact)
|
51
|
+
file_name = "#{artifact_id}-#{version}.#{extension}"
|
52
|
+
put_string = "content/repositories/#{configuration['repository']}/#{group_id.gsub(".", "/")}/#{artifact_id.gsub(".", "/")}/#{version}/#{file_name}"
|
53
|
+
response = nexus.put(nexus_url(put_string), File.open(file))
|
54
|
+
|
55
|
+
case response.status
|
56
|
+
when 201
|
57
|
+
pom_name = "#{artifact_id}-#{version}.pom"
|
58
|
+
put_string = "content/repositories/#{configuration['repository']}/#{group_id.gsub(".", "/")}/#{artifact_id.gsub(".", "/")}/#{version}/#{pom_name}"
|
59
|
+
pom_file = generate_fake_pom(pom_name, group_id, artifact_id, version, extension)
|
60
|
+
nexus.put(nexus_url(put_string), File.open(pom_file))
|
61
|
+
delete_string = "/service/local/metadata/repositories/#{configuration['repository']}/content/#{group_id.gsub(".", "/")}/#{artifact_id.gsub(".", "/")}"
|
62
|
+
nexus.delete(nexus_url(delete_string))
|
63
|
+
return true
|
64
|
+
when 400
|
65
|
+
raise BadUploadRequestException
|
66
|
+
when 401
|
67
|
+
raise PermissionsException
|
68
|
+
when 403
|
69
|
+
raise PermissionsException
|
70
|
+
when 404
|
71
|
+
raise NexusHTTP404.new(response.content)
|
72
|
+
else
|
73
|
+
raise UnexpectedStatusCodeException.new(response.status)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def delete_artifact(artifact)
|
78
|
+
group_id, artifact_id, version = parse_artifact_string(artifact)
|
79
|
+
response = nexus.delete(nexus_url("content/repositories/#{configuration['repository']}/#{group_id.gsub(".", "/")}/#{artifact_id.gsub(".", "/")}/#{version}"))
|
80
|
+
case response.status
|
81
|
+
when 204
|
82
|
+
return true
|
83
|
+
else
|
84
|
+
raise UnexpectedStatusCodeException.new(response.status)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
# Retrieves information about the given [artifact] and returns
|
90
|
+
# it in as a [String] of XML.
|
91
|
+
#
|
92
|
+
# @param artifact [String] the Maven identifier
|
93
|
+
#
|
94
|
+
# @return [String] A string of XML data about the desired artifact
|
95
|
+
def get_artifact_info(artifact)
|
96
|
+
group_id, artifact_id, version, extension = parse_artifact_string(artifact)
|
97
|
+
response = nexus.get(nexus_url("service/local/artifact/maven/resolve"), :query => {:g => group_id, :a => artifact_id, :v => version, :e => extension, :r => configuration['repository']})
|
98
|
+
case response.status
|
99
|
+
when 200
|
100
|
+
return response.content
|
101
|
+
when 404
|
102
|
+
raise ArtifactNotFoundException
|
103
|
+
when 503
|
104
|
+
raise CouldNotConnectToNexusException
|
105
|
+
else
|
106
|
+
raise UnexpectedStatusCodeException.new(response.status)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
# Searches for an artifact using the given identifier.
|
112
|
+
#
|
113
|
+
# @param artifact [String] the Maven identifier
|
114
|
+
# @example com.artifact:my-artifact
|
115
|
+
#
|
116
|
+
# @return [Array<String>] a formatted Array of results
|
117
|
+
# @example
|
118
|
+
# 1.0.0 `nexus-cli pull com.artifact:my-artifact:1.0.0:tgz`
|
119
|
+
# 2.0.0 `nexus-cli pull com.artifact:my-artifact:2.0.0:tgz`
|
120
|
+
# 3.0.0 `nexus-cli pull com.artifact:my-artifact:3.0.0:tgz`
|
121
|
+
def search_for_artifacts(artifact)
|
122
|
+
group_id, artifact_id = artifact.split(":")
|
123
|
+
response = nexus.get(nexus_url("service/local/data_index"), :query => {:g => group_id, :a => artifact_id})
|
124
|
+
case response.status
|
125
|
+
when 200
|
126
|
+
doc = Nokogiri::XML(response.content)
|
127
|
+
return format_search_results(doc, group_id, artifact_id)
|
128
|
+
else
|
129
|
+
raise UnexpectedStatusCodeException.new(response.status)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def transfer_artifact(artifact, from_repository, to_repository)
|
134
|
+
do_transfer_artifact(artifact, from_repository, to_repository)
|
135
|
+
end
|
136
|
+
|
137
|
+
private
|
138
|
+
|
139
|
+
# Formats the given XML into an [Array<String>] so it
|
140
|
+
# can be displayed nicely.
|
141
|
+
#
|
142
|
+
# @param doc [Nokogiri::XML] the xml search results
|
143
|
+
# @param group_id [String] the group id
|
144
|
+
# @param artifact_id [String] the artifact id
|
145
|
+
#
|
146
|
+
# @return [type] [description]
|
147
|
+
def format_search_results(doc, group_id, artifact_id)
|
148
|
+
versions = doc.xpath("//version").inject([]) {|array,node| array << "#{node.content()}"}
|
149
|
+
if versions.length > 0
|
150
|
+
indent_size = versions.max{|a,b| a.length <=> b.length}.size+4
|
151
|
+
formated_results = ['Found Versions:']
|
152
|
+
versions.inject(formated_results) do |array,version|
|
153
|
+
temp_version = version + ":"
|
154
|
+
array << "#{temp_version.ljust(indent_size)} `nexus-cli pull #{group_id}:#{artifact_id}:#{version}:tgz`"
|
155
|
+
end
|
156
|
+
else
|
157
|
+
formated_results = ['No Versions Found.']
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
# Transfers an artifact from one repository
|
162
|
+
# to another. Sometimes called a `promotion`
|
163
|
+
#
|
164
|
+
# @param artifact [String] a Maven identifier
|
165
|
+
# @param from_repository [String] the name of the from repository
|
166
|
+
# @param to_repository [String] the name of the to repository
|
167
|
+
#
|
168
|
+
# @return [Boolean] returns true when successful
|
169
|
+
def do_transfer_artifact(artifact, from_repository, to_repository)
|
170
|
+
Dir.mktmpdir do |temp_dir|
|
171
|
+
configuration["repository"] = sanitize_for_id(from_repository)
|
172
|
+
artifact_file = pull_artifact(artifact, temp_dir)
|
173
|
+
configuration["repository"] = sanitize_for_id(to_repository)
|
174
|
+
push_artifact(artifact, artifact_file[:file_path])
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
def generate_fake_pom(pom_name, group_id, artifact_id, version, extension)
|
179
|
+
Tempfile.open(pom_name) do |file|
|
180
|
+
template_path = File.join(NexusCli.root, "data", "pom.xml.erb")
|
181
|
+
file.puts ERB.new(File.read(template_path)).result(binding)
|
182
|
+
file
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module NexusCli
|
4
|
+
# @author Kyle Allan <kallan@riotgames.com>
|
5
|
+
module GlobalSettingsActions
|
6
|
+
|
7
|
+
# Retrieves the global settings of the Nexus server
|
8
|
+
#
|
9
|
+
# @return [File] a File with the global settings.
|
10
|
+
def get_global_settings
|
11
|
+
json = get_global_settings_json
|
12
|
+
pretty_json = JSON.pretty_generate(JSON.parse(json))
|
13
|
+
Dir.mkdir(File.expand_path("~/.nexus")) unless Dir.exists?(File.expand_path("~/.nexus"))
|
14
|
+
destination = File.join(File.expand_path("~/.nexus"), "global_settings.json")
|
15
|
+
artifact_file = File.open(destination, 'wb') do |file|
|
16
|
+
file.write(pretty_json)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_global_settings_json
|
21
|
+
response = nexus.get(nexus_url("service/local/global_settings/current"), :header => DEFAULT_ACCEPT_HEADER)
|
22
|
+
case response.status
|
23
|
+
when 200
|
24
|
+
return response.content
|
25
|
+
else
|
26
|
+
raise UnexpectedStatusCodeException.new(response.status)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def upload_global_settings(json=nil)
|
31
|
+
global_settings = nil
|
32
|
+
if json == nil
|
33
|
+
global_settings = File.read(File.join(File.expand_path("~/.nexus"), "global_settings.json"))
|
34
|
+
else
|
35
|
+
global_settings = json
|
36
|
+
end
|
37
|
+
response = nexus.put(nexus_url("service/local/global_settings/current"), :body => global_settings, :header => DEFAULT_CONTENT_TYPE_HEADER)
|
38
|
+
case response.status
|
39
|
+
when 204
|
40
|
+
return true
|
41
|
+
when 400
|
42
|
+
raise BadSettingsException.new(response.content)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def reset_global_settings
|
47
|
+
response = nexus.get(nexus_url("service/local/global_settings/default"), :header => DEFAULT_ACCEPT_HEADER)
|
48
|
+
case response.status
|
49
|
+
when 200
|
50
|
+
default_json = response.content
|
51
|
+
else
|
52
|
+
raise UnexpectedStatusCodeException.new(response.status)
|
53
|
+
end
|
54
|
+
|
55
|
+
response = nexus.put(nexus_url("service/local/global_settings/current"), :body => default_json, :header => DEFAULT_CONTENT_TYPE_HEADER)
|
56
|
+
case response.status
|
57
|
+
when 204
|
58
|
+
return true
|
59
|
+
else
|
60
|
+
raise UnexpectedStatusCodeException.new(response.status)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module NexusCli
|
2
|
+
# @author Kyle Allan <kallan@riotgames.com>
|
3
|
+
module LoggingActions
|
4
|
+
|
5
|
+
# Gets information about the current logging
|
6
|
+
# levels in Nexus.
|
7
|
+
#
|
8
|
+
#
|
9
|
+
# @return [String] a String of JSON representing the current logging levels of Nexus
|
10
|
+
def get_logging_info
|
11
|
+
response = nexus.get(nexus_url("service/local/log/config"), :header => DEFAULT_ACCEPT_HEADER)
|
12
|
+
case response.status
|
13
|
+
when 200
|
14
|
+
return response.content
|
15
|
+
else
|
16
|
+
raise UnexpectedStatusCodeException.new(response.status)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
# Sets the logging level of Nexus to one of
|
22
|
+
# "INFO", "DEBUG", or "ERROR".
|
23
|
+
#
|
24
|
+
# @param level [String] the logging level to set
|
25
|
+
#
|
26
|
+
# @return [Boolean] true if the logging level has been set, false otherwise
|
27
|
+
def set_logger_level(level)
|
28
|
+
raise InvalidLoggingLevelException unless ["INFO", "DEBUG", "ERROR"].include?(level.upcase)
|
29
|
+
response = nexus.put(nexus_url("service/local/log/config"), :body => create_logger_level_json(level), :header => DEFAULT_CONTENT_TYPE_HEADER)
|
30
|
+
case response.status
|
31
|
+
when 200
|
32
|
+
return true
|
33
|
+
else
|
34
|
+
raise UnexpectedStatusCodeException.new(response.status)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def create_logger_level_json(level)
|
41
|
+
params = {:rootLoggerLevel => level.upcase}
|
42
|
+
JSON.dump(:data => params)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -1,9 +1,7 @@
|
|
1
|
-
require 'httpclient'
|
2
|
-
require 'nokogiri'
|
3
|
-
require 'yaml'
|
4
|
-
|
5
1
|
module NexusCli
|
6
|
-
|
2
|
+
# @author Kyle Allan <kallan@riotgames.com>
|
3
|
+
module CustomMetadataActions
|
4
|
+
|
7
5
|
# Gets the custom metadata for an artifact
|
8
6
|
# @param [String] artifact The GAVE string of the artifact
|
9
7
|
# @result [String] The resulting custom metadata xml from the get operation
|
@@ -82,186 +80,6 @@ module NexusCli
|
|
82
80
|
return result.nil? ? "" : result.to_xml(:indent => 4)
|
83
81
|
end
|
84
82
|
|
85
|
-
def get_pub_sub(repository_id)
|
86
|
-
response = nexus.get(nexus_url("service/local/smartproxy/pub-sub/#{repository_id}"))
|
87
|
-
case response.status
|
88
|
-
when 200
|
89
|
-
return response.content
|
90
|
-
else
|
91
|
-
raise UnexpectedStatusCodeException.new(response.status)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def enable_artifact_publish(repository_id)
|
96
|
-
params = {:repositoryId => repository_id}
|
97
|
-
params[:publish] = true
|
98
|
-
artifact_publish(repository_id, params)
|
99
|
-
end
|
100
|
-
|
101
|
-
def disable_artifact_publish(repository_id)
|
102
|
-
params = {:repositoryId => repository_id}
|
103
|
-
params[:publish] = false
|
104
|
-
artifact_publish(repository_id, params)
|
105
|
-
end
|
106
|
-
|
107
|
-
def artifact_publish(repository_id, params)
|
108
|
-
response = nexus.put(nexus_url("service/local/smartproxy/pub-sub/#{sanitize_for_id(repository_id)}"), :body => create_pub_sub_json(params), :header => DEFAULT_CONTENT_TYPE_HEADER)
|
109
|
-
case response.status
|
110
|
-
when 200
|
111
|
-
return true
|
112
|
-
else
|
113
|
-
raise UnexpectedStatusCodeException.new(response.status)
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
def enable_artifact_subscribe(repository_id, preemptive_fetch)
|
118
|
-
raise NotProxyRepositoryException.new(repository_id) unless Nokogiri::XML(get_repository_info(repository_id)).xpath("/repository/data/repoType").first.content == "proxy"
|
119
|
-
|
120
|
-
params = {:repositoryId => repository_id}
|
121
|
-
params[:subscribe] = true
|
122
|
-
params[:preemptiveFetch] = preemptive_fetch
|
123
|
-
artifact_subscribe(repository_id, params)
|
124
|
-
end
|
125
|
-
|
126
|
-
def disable_artifact_subscribe(repository_id)
|
127
|
-
raise NotProxyRepositoryException.new(repository_id) unless Nokogiri::XML(get_repository_info(repository_id)).xpath("/repository/data/repoType").first.content == "proxy"
|
128
|
-
|
129
|
-
params = {:repositoryId => repository_id}
|
130
|
-
params[:subscribe] = false
|
131
|
-
artifact_subscribe(repository_id, params)
|
132
|
-
end
|
133
|
-
|
134
|
-
def artifact_subscribe(repository_id, params)
|
135
|
-
response = nexus.put(nexus_url("service/local/smartproxy/pub-sub/#{sanitize_for_id(repository_id)}"), :body => create_pub_sub_json(params), :header => DEFAULT_CONTENT_TYPE_HEADER)
|
136
|
-
case response.status
|
137
|
-
when 200
|
138
|
-
return true
|
139
|
-
else
|
140
|
-
raise UnexpectedStatusCodeException.new(response.status)
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
def enable_smart_proxy(host=nil, port=nil)
|
145
|
-
params = {:enabled => true}
|
146
|
-
params[:host] = host unless host.nil?
|
147
|
-
params[:port] = port unless port.nil?
|
148
|
-
smart_proxy(params)
|
149
|
-
end
|
150
|
-
|
151
|
-
def disable_smart_proxy
|
152
|
-
params = {:enabled => false}
|
153
|
-
smart_proxy(params)
|
154
|
-
end
|
155
|
-
|
156
|
-
def smart_proxy(params)
|
157
|
-
response = nexus.put(nexus_url("service/local/smartproxy/settings"), :body => create_smart_proxy_settings_json(params), :header => DEFAULT_CONTENT_TYPE_HEADER)
|
158
|
-
case response.status
|
159
|
-
when 200
|
160
|
-
return true
|
161
|
-
else
|
162
|
-
raise UnexpectedStatusCodeException.new(response.status)
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
def get_smart_proxy_settings
|
167
|
-
response = nexus.get(nexus_url("service/local/smartproxy/settings"), :header => DEFAULT_ACCEPT_HEADER)
|
168
|
-
case response.status
|
169
|
-
when 200
|
170
|
-
return response.content
|
171
|
-
else
|
172
|
-
raise UnexpectedStatusCodeException.new(response.status)
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
def get_smart_proxy_key
|
177
|
-
response = nexus.get(nexus_url("service/local/smartproxy/settings"), :header => DEFAULT_ACCEPT_HEADER)
|
178
|
-
case response.status
|
179
|
-
when 200
|
180
|
-
return response.content
|
181
|
-
else
|
182
|
-
raise UnexpectedStatusCodeException.new(response.status)
|
183
|
-
end
|
184
|
-
end
|
185
|
-
|
186
|
-
def add_trusted_key(certificate, description, path=true)
|
187
|
-
params = {:description => description}
|
188
|
-
params[:certificate] = path ? File.read(File.expand_path(certificate)) : certificate
|
189
|
-
response = nexus.post(nexus_url("service/local/smartproxy/trusted-keys"), :body => create_add_trusted_key_json(params), :header => DEFAULT_CONTENT_TYPE_HEADER)
|
190
|
-
case response.status
|
191
|
-
when 201
|
192
|
-
return true
|
193
|
-
else
|
194
|
-
raise UnexpectedStatusCodeException.new(response.status)
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
def delete_trusted_key(key_id)
|
199
|
-
response = nexus.delete(nexus_url("service/local/smartproxy/trusted-keys/#{key_id}"))
|
200
|
-
case response.status
|
201
|
-
when 204
|
202
|
-
return true
|
203
|
-
else
|
204
|
-
raise UnexpectedStatusCodeException.new(response.status)
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
def get_trusted_keys
|
209
|
-
response = nexus.get(nexus_url("service/local/smartproxy/trusted-keys"), :header => DEFAULT_ACCEPT_HEADER)
|
210
|
-
case response.status
|
211
|
-
when 200
|
212
|
-
return response.content
|
213
|
-
else
|
214
|
-
raise UnexpectedStatusCodeException.new(response.status)
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
218
|
-
def get_license_info
|
219
|
-
response = nexus.get(nexus_url("service/local/licensing"), :header => DEFAULT_ACCEPT_HEADER)
|
220
|
-
case response.status
|
221
|
-
when 200
|
222
|
-
return response.content
|
223
|
-
else
|
224
|
-
raise UnexpectedStatusCodeException.new(response.status)
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
|
-
def install_license(license_file)
|
229
|
-
file = File.read(File.expand_path(license_file))
|
230
|
-
response = nexus.post(nexus_url("service/local/licensing/upload"), :body => file, :header => {"Content-Type" => "application/octet-stream"})
|
231
|
-
case response.status
|
232
|
-
when 201
|
233
|
-
return true
|
234
|
-
when 403
|
235
|
-
raise LicenseInstallFailure
|
236
|
-
else
|
237
|
-
raise UnexpectedStatusCodeException.new(response.status)
|
238
|
-
end
|
239
|
-
end
|
240
|
-
|
241
|
-
def install_license_bytes(bytes)
|
242
|
-
response = nexus.post(nexus_url("service/local/licensing/upload"), :body => bytes, :header => {"Content-Type" => "application/octet-stream"})
|
243
|
-
case response.status
|
244
|
-
when 201
|
245
|
-
return true
|
246
|
-
when 403
|
247
|
-
raise LicenseInstallFailure
|
248
|
-
else
|
249
|
-
raise UnexpectedStatusCodeException.new(response.status)
|
250
|
-
end
|
251
|
-
end
|
252
|
-
|
253
|
-
def transfer_artifact(artifact, from_repository, to_repository)
|
254
|
-
do_transfer_artifact(artifact, from_repository, to_repository)
|
255
|
-
|
256
|
-
configuration["repository"] = sanitize_for_id(from_repository)
|
257
|
-
from_artifact_metadata = get_custom_metadata_hash(artifact)
|
258
|
-
|
259
|
-
configuration["repository"] = sanitize_for_id(to_repository)
|
260
|
-
to_artifact_metadata = get_custom_metadata_hash(artifact)
|
261
|
-
|
262
|
-
do_update_custom_metadata(artifact, from_artifact_metadata, to_artifact_metadata)
|
263
|
-
end
|
264
|
-
|
265
83
|
private
|
266
84
|
|
267
85
|
def get_custom_metadata_hash(artifact)
|
@@ -283,19 +101,7 @@ module NexusCli
|
|
283
101
|
raise UnexpectedStatusCodeException.new(response.status)
|
284
102
|
end
|
285
103
|
end
|
286
|
-
|
287
|
-
def create_add_trusted_key_json(params)
|
288
|
-
JSON.dump(:data => params)
|
289
|
-
end
|
290
|
-
|
291
|
-
def create_smart_proxy_settings_json(params)
|
292
|
-
JSON.dump(:data => params)
|
293
|
-
end
|
294
|
-
|
295
|
-
def create_pub_sub_json(params)
|
296
|
-
JSON.dump(:data => params)
|
297
|
-
end
|
298
|
-
|
104
|
+
|
299
105
|
# Converts an array of parameters used to update custom metadata
|
300
106
|
# @param [Array] *params The array of key:value strings
|
301
107
|
# @return [Hash] The resulting hash of parsed key:value items
|
@@ -359,4 +165,4 @@ module NexusCli
|
|
359
165
|
end
|
360
166
|
end
|
361
167
|
end
|
362
|
-
end
|
168
|
+
end
|