nessus_client 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8bd8d8e9586e3b3023b0a0ca4b0cf42c78519ad0b83c7d7a2d0d9b9adaf133bc
4
- data.tar.gz: 9734f1945a3daffbd200714f6f736f45d41b3c6d2d3901f35f043775d7a3d6ae
3
+ metadata.gz: f66280ff351ca3d9c29874252f4a88d9a3758f2ba16d6db75812edce9e40d1b9
4
+ data.tar.gz: 41d3b43e5a05682680ba05f6b7d33fec52ed81ddbd8a996eb27f7af499310b3a
5
5
  SHA512:
6
- metadata.gz: d68ef88707cf6d6e83171a2b4de47d27ce8f6938e6968acbd2aae05836e755017747f917aa3de0792f06b14d8a7fdf6750ad4069d3e51bcb2bba81cd5e30d680
7
- data.tar.gz: cf523010cf9bd661dc5ccb708215c4b50d6b0d3f251ecef17d2ae090eecbe0f139bff31d2a2ad87ff33ab647668fd023b0903ee587299ef62dd74f8e8a05caea
6
+ metadata.gz: 9a3ca44fbc46b2ff5a230e81457618976a9648a5c5154c39bfd82e29453f6530658b1aa884712f4d343b574e48389d3547a4ad60313652b488382faa0c528e28
7
+ data.tar.gz: 3251fca055bccd4aae51eba580ada175ad670f1ae5d9b2b982a4a1f218816b865cbe5246e32368d39e8545f93eeeea7f374f244f94ac33aa9ba720ca11f68680
@@ -1,24 +1,25 @@
1
+ # frozen_string_literal: true
1
2
 
2
- module Resource::Exports # Namespace for Exports resource.
3
-
3
+ # Namespace for Exports resource.
4
+ module Resource::Exports
4
5
  # Export the given scan. Once requested, the file can be downloaded using the Resource::Tokens.token_download method upon receiving a "ready" status from the Resource::Tokens#token_status method. You can also use the older Resource::Exports#export_status and Resource::Exports#export_download methods.
5
6
  # @param [String] scan_id The export uuid string.
6
7
  # @param [String] format The file format to use (Nessus, HTML, PDF, CSV, or DB).
7
- # @return [JSON]
8
- def export_request( scan_id, format="nessus" )
9
- payload = {:format => format }
10
- self.request.post( { :path => "/scans/#{scan_id}/export", :payload => payload, :headers => self.headers} )
8
+ # @return [JSON]
9
+ def export_request(scan_id, format = 'nessus')
10
+ payload = { format: format }
11
+ request.post({ path: "/scans/#{scan_id}/export", payload: payload, headers: headers })
11
12
  end
12
13
 
13
14
  # Check the file status of an exported scan. When an export has been requested, it is necessary to poll this resource until a "ready" status is returned, at which point the file is complete and can be downloaded using the export download resource.
14
15
  # @param [String] scan_id The identifier for the scan. This identifier can be the either the 'schedule_uuid' or the numeric 'id' attribute for the scan. We recommend that you use 'schedule_uuid'.
15
16
  # @param [String] file_id The ID of the file to poll (Included in response from #export_request).
16
- # @return [JSON]
17
+ # @return [JSON]
17
18
  # @example Checking the status of a export.
18
19
  # export_status = nc.export_status( "15", "cd956" )
19
20
  # return true if export_status["status"] == "ready"
20
- def export_status( scan_id, file_id )
21
- self.request.get( {:path => "/scans/#{scan_id}/export/#{file_id}/status", :headers => self.headers} )
21
+ def export_status(scan_id, file_id)
22
+ request.get({ path: "/scans/#{scan_id}/export/#{file_id}/status", headers: headers })
22
23
  end
23
24
 
24
25
  # Download exported scan.
@@ -30,8 +31,7 @@ module Resource::Exports # Namespace for Exports resource.
30
31
  # open("scan_report", "wb") do |file|
31
32
  # file.write( export )
32
33
  # end
33
- def export_download( scan_id, file_id )
34
- self.request.get( {:path => "/scans/#{scan_id}/export/#{file_id}/download", :headers => self.headers} )
34
+ def export_download(scan_id, file_id)
35
+ request.get({ path: "/scans/#{scan_id}/export/#{file_id}/download", headers: headers })
35
36
  end
36
-
37
37
  end
@@ -1,14 +1,18 @@
1
- module Resource::Folders # Namespace for Folders resource.
1
+ # frozen_string_literal: true
2
+
3
+ # Namespace for Folders resource.
4
+ module Resource::Folders
2
5
  # Get the list of folders from the resource.
3
6
  # @return [JSON]
4
7
  def list_folders
5
- self.request.get({:path => "/folders", :headers => self.headers})
8
+ request.get({ path: '/folders', headers: headers })
6
9
  end
10
+
7
11
  # Create a folder into the resource.
8
12
  # @param [String] folder_name The name of the folder the will be created.
9
13
  # @return [JSON]
10
- def create_folder( folder_name )
11
- payload = {:name => folder_name }
12
- self.request.post({:path=>"/folders", :payload => payload, :headers => self.headers})
14
+ def create_folder(folder_name)
15
+ payload = { name: folder_name }
16
+ request.post({ path: '/folders', payload: payload, headers: headers })
13
17
  end
14
- end
18
+ end
@@ -1,7 +1,10 @@
1
- module Resource::Policies # Namespace for Policies resource.
1
+ # frozen_string_literal: true
2
+
3
+ # Namespace for Policies resource.
4
+ module Resource::Policies
2
5
  # List the scan polices.
3
6
  # @return [JSON]
4
7
  def policies
5
- self.request.get( {:path => "/policies", :headers => self.headers} )
8
+ request.get({ path: '/policies', headers: headers })
6
9
  end
7
10
  end
@@ -1,50 +1,50 @@
1
+ # frozen_string_literal: true
1
2
 
2
- module Resource::Scans # Namespace for Scans resource.
3
-
3
+ # Namespace for Scans resource.
4
+ module Resource::Scans
4
5
  # List scans from the resource.
5
6
  # @param [String] folder_id (nil) The name of a alredy created scan.
6
7
  # @return [JSON]
7
- def list_scans( folder_id=nil )
8
- query = folder_id.nil? ? nil : { "folder_id" => folder_id }
9
- self.request.get( {path: "/scans", query: query, headers: self.headers} )
8
+ def list_scans(folder_id = nil)
9
+ query = folder_id.nil? ? nil : { 'folder_id' => folder_id }
10
+ request.get({ path: '/scans', query: query, headers: headers })
10
11
  end
11
- alias_method :scans, :list_scans
12
+ alias scans list_scans
12
13
 
13
14
  # See details of a scan.
14
15
  # @param [String] scan_id The `uuid` of a scan.
15
16
  # @param [String] history_id (nil) The `history_id` of a scan.
16
17
  # @return [JSON]
17
- def scan_details( scan_id, history_id=nil )
18
- query = history_id.nil? ? nil : { "history_id" => history_id }
19
- self.request.get( {:path => "/scans/#{scan_id}", :query => query, :headers => self.headers} )
18
+ def scan_details(scan_id, history_id = nil)
19
+ query = history_id.nil? ? nil : { 'history_id' => history_id }
20
+ request.get({ path: "/scans/#{scan_id}", query: query, headers: headers })
20
21
  end
21
22
 
22
23
  # Lauch a scan by its id
23
24
  # @param [Integer] scan_id The ID of a alredy created scan.
24
25
  # @param [Array<String>] targets comma separeted new target to be scanned.
25
26
  # @return [JSON]
26
- def launch( scan_id, targets=[] )
27
- payload = { :alt_targets => targets } unless targets.empty?
28
- self.request.post( {:path => "/scans/#{scan_id}/launch", :payload => payload, :headers => self.headers} )
27
+ def launch(scan_id, targets = [])
28
+ payload = { alt_targets: targets } unless targets.empty?
29
+ request.post({ path: "/scans/#{scan_id}/launch", payload: payload, headers: headers })
29
30
  end
30
31
 
31
32
  # Lauch a scan by its name
32
33
  # @param [String] scan_name The name of a alredy created scan.
33
34
  # @param [Array<String>] targets comma separeted new target to be scanned.
34
35
  # @return [JSON]
35
- def launch_by_name( scan_name, targets=[] )
36
- scan_id = get_scan_by_name( scan_name )
37
- launch( scan_id, targets )
36
+ def launch_by_name(scan_name, targets = [])
37
+ scan_id = get_scan_by_name(scan_name)
38
+ launch(scan_id, targets)
38
39
  end
39
40
 
40
41
  # Get a scan by its name
41
42
  # @param [String] folder_id The id of the folder to look into.
42
43
  # @param [String] scan_name The name of the scan to look for.
43
44
  # @return [String, nil] The uuid of the scan.
44
- def get_scan_by_name( folder_id=nil, scan_name )
45
- list_scans( folder_id )["scans"].each do |scan|
45
+ def get_scan_by_name(scan_name, folder_id = nil)
46
+ list_scans(folder_id)['scans'].each do |scan|
46
47
  return scan['id'] if scan['name'] == scan_name
47
48
  end
48
49
  end
49
-
50
- end
50
+ end
@@ -1,15 +1,16 @@
1
- module Resource::Server # Namespace for Server resource.
2
-
1
+ # frozen_string_literal: true
2
+
3
+ # Namespace for Server resource.
4
+ module Resource::Server
3
5
  # Returns the server status.
4
- # @return [JSON] Returns the server status (loading, ready, corrupt-db, feed-expired, eval-expired, locked, register, register-locked, download-failed, feed-error).
6
+ # @return [JSON] Returns the server status
5
7
  def server_status
6
- self.request.get( {:path => "/server/status", :headers => self.headers} )
8
+ request.get({ path: '/server/status', headers: headers })
7
9
  end
8
-
10
+
9
11
  # Returns the server version and other properties.
10
12
  # @return [JSON] Returns the server properties
11
13
  def server_properties
12
- self.request.get( {:path => "/server/properties", :headers => self.headers} )
14
+ request.get({ path: '/server/properties', headers: headers })
13
15
  end
14
-
15
- end
16
+ end
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
1
2
 
2
- module Resource::Session # Namespace for Session resource.
3
-
3
+ # Namespace for Session resource.
4
+ module Resource::Session
4
5
  # @return [Boolean] whether has a session.
5
6
  attr_reader :session
6
7
 
@@ -12,50 +13,50 @@ module Resource::Session # Namespace for Session resource.
12
13
  # @return [nil]
13
14
  # @raise [NessusClient::Error] Unable to authenticate.
14
15
  # @todo Validate response token format
15
- def set_session( username, password )
16
-
16
+ def set_session(username, password)
17
17
  payload = {
18
18
  username: username,
19
19
  password: password
20
20
  }
21
21
 
22
- resp = self.request.post( {path: '/session', payload: payload, headers: self.headers} )
23
-
24
- raise NessusClient::Error.new( "Unable to authenticate. The response did not include a session token." ) unless resp.has_key?("token")
25
- raise NessusClient::Error.new( "The token doesnt match with the pattern." ) unless resp["token"].match(%r{(?<token>[a-z0-9]{48})})
26
-
27
- begin
28
- self.headers.update( 'X-Cookie' => 'token=' + resp["token"] )
29
- @session = true
30
- self.headers.update( 'X-API-Token' => set_api_token() )
31
- rescue NessusClient::Error => err
32
- puts err.message
33
- ensure
34
- return
22
+ resp = request.post({ path: '/session', payload: payload, headers: headers })
23
+ # binding.pry
24
+ if !resp.key?('token')
25
+ raise NessusClient::Error, 'Unable to authenticate.'
26
+ elsif !resp['token'].match(/(?<token>[a-z0-9]{48})/)
27
+ raise NessusClient::Error, 'The token doesnt match with the pattern.'
35
28
  end
36
-
29
+
30
+ headers.update('X-Cookie' => 'token=' + resp['token'])
31
+ @session = true
32
+ api_token = set_api_token
33
+ headers.update('X-API-Token' => api_token) if api_token
34
+ rescue NessusClient::Error => e
35
+ raise e
37
36
  end
38
- alias_method :session_create, :set_session
37
+ alias session_create set_session
39
38
 
40
- # Destroy the current session.
41
- def destroy
42
- self.request.delete( {path: '/session', headers: self.headers} )
39
+ # Destroy the current session.
40
+ def destroy
41
+ request.delete({ path: '/session', headers: headers })
43
42
  @session = false
44
43
  end
45
- alias_method :logout , :destroy
44
+ alias logout destroy
46
45
 
47
46
  private
47
+
48
48
  # Set the API Token from legacy Nessus version
49
49
  # @raise [NessusClient::Error] Unable to get API Token.
50
50
  # @todo To get it direct from the session authentication on v6.x
51
51
  def set_api_token
52
- response = self.request.get( {path: "/nessus6.js", headers: self.headers} )
53
- response.match( %r{return"(\w{8}-(?:\w{4}-){3}\w{12})"\}} )
54
-
55
- raise NessusClient::Error.new( "Unable to get API Token. Some features won't work." ) unless $1
56
-
57
- return $1
58
-
52
+ response = request.get({ path: '/nessus6.js', headers: headers })
53
+ response.match(/return"(\w{8}-(?:\w{4}-){3}\w{12})"\}/)
54
+ unless Regexp.last_match(1)
55
+ raise NessusClient::Error, "Unable to get API Token. Some features won't work."
56
+ end
57
+ rescue NessusClient::Error => e
58
+ puts e.message
59
+ else
60
+ Regexp.last_match(1)
59
61
  end
60
-
61
62
  end
@@ -1,25 +1,26 @@
1
- module Resource::Tokens # Namespace for tokens resource.
2
-
3
- # Check the status of a export request
4
- # @param [String] export_uuid The export uuid string.
5
- # @return [JSON]
6
- # @example Checking the status of a export.
7
- # export_status = nc.export_status( "73376c41-1508-46b7-8587-483d159cd956" )
8
- # return true if export_status["status"] == "ready"
9
- def token_status( export_uuid )
10
- self.request.get( {:path => "/tokens/#{export_uuid}/status", :headers => self.headers} )
11
- end
12
-
13
- # Check the download of a export request
14
- # @param [String] export_uuid The export uuid string.
15
- # @return [JSON] (@see #format)
16
- # @example Download a ready export.
17
- # export = nc.export_download( '73376c41-1508-46b7-8587-483d159cd956')
18
- # open("scan_report", "wb") do |file|
19
- # file.write( export )
20
- # end
21
- def token_download( export_uuid )
22
- self.request.get( {:path => "/tokens/#{export_uuid}/download", :headers => self.headers} )
23
- end
24
-
25
- end
1
+ # frozen_string_literal: true
2
+
3
+ # Namespace for tokens resource.
4
+ module Resource::Tokens
5
+ # Check the status of a export request
6
+ # @param [String] export_uuid The export uuid string.
7
+ # @return [JSON]
8
+ # @example Checking the status of a export.
9
+ # export_status = nc.export_status( "73376c41-1508-46b7-8587-483d159cd956" )
10
+ # return true if export_status["status"] == "ready"
11
+ def token_status(export_uuid)
12
+ request.get({ path: "/tokens/#{export_uuid}/status", headers: headers })
13
+ end
14
+
15
+ # Check the download of a export request
16
+ # @param [String] export_uuid The export uuid string.
17
+ # @return [JSON] (@see #format)
18
+ # @example Download a ready export.
19
+ # export = nc.export_download( '73376c41-1508-46b7-8587-483d159cd956')
20
+ # open("scan_report", "wb") do |file|
21
+ # file.write( export )
22
+ # end
23
+ def token_download(export_uuid)
24
+ request.get({ path: "/tokens/#{export_uuid}/download", headers: headers })
25
+ end
26
+ end
@@ -1,12 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'nessus_client/version'
2
4
  require_relative 'nessus_client/exception'
3
5
  require_relative 'nessus_client/resource'
4
6
 
5
- Dir[File.join(__dir__, 'modules', '*.rb')].each { |file| require file }
7
+ Dir[File.join(__dir__, 'modules', '*.rb')].sort.each { |file| require file }
6
8
 
7
9
  # Nessus resource abstraction.
8
10
  class NessusClient
9
-
10
11
  # @return [NessusClient::Request] Instance HTTP request object.
11
12
  # @see NessusClient::Request
12
13
  attr_reader :request
@@ -14,7 +15,7 @@ class NessusClient
14
15
  attr_reader :session
15
16
  # @return [Hash] Instance current HTTP headers.
16
17
  attr_reader :headers
17
-
18
+
18
19
  include Resource::Exports
19
20
  include Resource::Folders
20
21
  include Resource::Policies
@@ -23,34 +24,31 @@ class NessusClient
23
24
  include Resource::Session
24
25
  include Resource::Tokens
25
26
 
26
- autoload :Request, "nessus_client/request"
27
+ autoload :Request, 'nessus_client/request'
27
28
 
28
29
  # @param [Hash] params the options to create a NessusClient with.
29
30
  # @option params [String] :uri ('https://localhost:8834/') Nessus resource to connect with
30
31
  # @option params [String] :username (nil) Username to use in the connection
31
32
  # @option params [String] :password (nil) Password to use in the connection
32
33
  # @option params [String] :ssl_verify_peer (true) Whether should check valid SSL certificate
33
- def initialize( params={} )
34
-
35
- default_params = {
36
- uri: 'https://localhost:8834/',
37
- username: nil,
38
- password: nil,
34
+ def initialize(params = {})
35
+ default_params = {
36
+ uri: 'https://localhost:8834/',
37
+ username: nil,
38
+ password: nil,
39
39
  ssl_verify_peer: true
40
40
  }
41
- params = default_params.merge( params )
42
- req_params = params.select { |key, value| [:uri, :ssl_verify_peer].include?(key) }
41
+ params = default_params.merge(params)
42
+ req_params = params.select { |key, _value| %i[uri ssl_verify_peer].include?(key) }
43
43
 
44
- @request = NessusClient::Request.new( req_params )
44
+ @request = NessusClient::Request.new(req_params)
45
45
  @headers = NessusClient::Request::DEFAULT_HEADERS.dup
46
- self.set_session( params.fetch(:username), params.fetch(:password) )
47
-
46
+ set_session(params.fetch(:username), params.fetch(:password))
48
47
  end
49
48
 
50
49
  # Gets NessusClient::Session authentication status.
51
50
  # @return [Boolean] whether NessusClient has successfully authenticated.
52
51
  def has_session?
53
- self.session
52
+ session
54
53
  end
55
-
56
- end
54
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class NessusClient
2
4
  # Abstract Error class for NessusClient.
3
5
  class Error < ::StandardError
@@ -5,8 +7,8 @@ class NessusClient
5
7
  # @param [String] msg The exception message.
6
8
  # @example
7
9
  # NessusClient::Error.new('This is a custom error.')
8
- def initialize( msg )
10
+ def initialize(msg)
9
11
  super
10
12
  end
11
13
  end
12
- end
14
+ end
@@ -1,26 +1,28 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'excon'
2
4
  require 'oj'
3
5
 
4
6
  class NessusClient
5
-
6
- # Abstract http request class for NessusClient. Provides some helper methods for perform HTTP requests.
7
+ # Abstract http request class for NessusClient.
8
+ # Provides some helper methods for perform HTTP requests.
7
9
  class Request
8
10
  # @return [String] The base url of the API.
9
11
  attr_reader :url
10
12
 
11
13
  # Default HTTP header to be used on the requests.
12
14
  DEFAULT_HEADERS = {
13
- "User-Agent" => "NessusClient::Request (https://rubygems.org/gems/nessus_client)",
14
- "Content-Type" => "application/json"
15
+ 'User-Agent' => 'NessusClient::Request - rubygems.org nessus_client',
16
+ 'Content-Type' => 'application/json'
15
17
  }.freeze
16
18
 
17
19
  # @param [Hash] params the options to create a NessusClient::Request with.
18
20
  # @option params [String] :uri ('https://localhost:8834/') Nessus server to connect with
19
21
  # @option params [String] :ssl_verify_peer (true) Whether should check valid SSL certificate
20
- def initialize( params={} )
21
- params = {:uri => nil }.merge( params )
22
- @@ssl_verify_peer = params[:ssl_verify_peer] ? true : false
23
- @url = @@url = NessusClient::Request.uri_parse( params.fetch(:uri) )
22
+ def initialize(params = {})
23
+ params = { uri: nil }.merge(params)
24
+ @ssl_verify_peer = params[:ssl_verify_peer] ? true : false
25
+ @url = NessusClient::Request.uri_parse(params.fetch(:uri))
24
26
  end
25
27
 
26
28
  # Perform a HTTP GET request.
@@ -28,9 +30,9 @@ class NessusClient
28
30
  # @option opts [String] path The URI path to perform the request.
29
31
  # @option opts [String] payload The HTTP body to send.
30
32
  # @option opts [String] query The URI query to send.
31
- # @return [JSON] The body of the resposnse if there is any.
32
- def get( opts={} )
33
- http_request( :get, opts )
33
+ # @return [Hash, String] The body of the resposnse if there is any.
34
+ def get(opts = {})
35
+ http_request(opts, :get)
34
36
  end
35
37
 
36
38
  # Perform a HTTP POST request.
@@ -38,9 +40,9 @@ class NessusClient
38
40
  # @option opts [String] path The URI path to perform the request.
39
41
  # @option opts [String] payload The HTTP body to send.
40
42
  # @option opts [String] query The URI query to send.
41
- # @return [JSON] The body of the resposnse if there is any.
42
- def post( opts={} )
43
- http_request( :post, opts )
43
+ # @return [Hash, String] The body of the resposnse if there is any.
44
+ def post(opts = {})
45
+ http_request(opts, :post)
44
46
  end
45
47
 
46
48
  # Perform a HTTP DELETE request.
@@ -48,21 +50,23 @@ class NessusClient
48
50
  # @option opts [String] path The URI path to perform the request.
49
51
  # @option opts [String] payload The HTTP body to send.
50
52
  # @option opts [String] query The URI query to send.
51
- # @return [JSON] The body of the resposnse if there is any.
52
- def delete( opts={} )
53
- http_request( :delete, opts )
53
+ # @return [Hash, String] The body of the resposnse if there is any.
54
+ def delete(opts = {})
55
+ http_request(opts, :delete)
54
56
  end
55
57
 
56
58
  # Parse a receiveid string against the URI stantard.
57
59
  # @param [String] uri A string to be validate URI.
58
60
  # @return [String] A string uri.
59
- def self.uri_parse( uri )
60
- url = URI.parse( uri )
61
+ def self.uri_parse(uri)
62
+ url = URI.parse(uri)
61
63
  raise URI::InvalidURIError unless url.scheme
62
- return url.to_s
64
+
65
+ url.to_s
63
66
  end
64
67
 
65
68
  private
69
+
66
70
  # @private HTTP request abstraction to be used.
67
71
  # @param [Symbol] method The HTTP method to be used on the request.
68
72
  # @param [Hash] args Parameters to use in the request.
@@ -70,38 +74,25 @@ class NessusClient
70
74
  # @option args [String] payload (nil) The HTTP body to send.
71
75
  # @option args [String] query (nil) The URI query to send.
72
76
  # @option args [String] headers (nil) The headers to send.
73
- # @return [JSON] The body of the resposnse if there is any.
74
- def http_request( method=:get, args )
75
- begin
76
-
77
- opts = {
78
- :path => nil,
79
- :payload => nil,
80
- :query => nil,
81
- :headers => nil
82
- }.merge( args )
83
-
84
- connection = Excon.new( @@url, {ssl_verify_peer: @@ssl_verify_peer} )
85
-
86
- body = opts[:payload] ? Oj.dump( opts[:payload], mode: :compat ) : ''
87
- options = {
88
- method: method,
89
- path: opts.fetch(:path),
90
- body: body,
91
- query: opts.fetch(:query),
92
- headers: opts.fetch(:headers),
93
- expects: [200, 201]
94
- }
95
-
96
- response = connection.request( options )
97
- ret = Oj.load(response.body) #if response.body.length > 0
98
- rescue Oj::ParseError => e
99
- return response.body
100
- else
101
- return ret
102
- end
77
+ # @return [Hash, String] The body of the resposnse if there is any.
78
+ def http_request(args, method = :get)
79
+ opts = { path: nil, payload: nil, query: nil, headers: nil }.merge(args)
80
+ connection = Excon.new(@url, { ssl_verify_peer: @ssl_verify_peer })
81
+ body = opts[:payload] ? Oj.dump(opts[:payload], mode: :compat) : ''
82
+ options = {
83
+ method: method,
84
+ path: opts.fetch(:path),
85
+ body: body,
86
+ query: opts.fetch(:query),
87
+ headers: opts.fetch(:headers),
88
+ expects: [200, 201]
89
+ }
90
+ response = connection.request(options)
91
+ ret = Oj.load(response.body) # if response.body.length > 0
92
+ rescue Oj::ParseError
93
+ response.body
94
+ else
95
+ ret
103
96
  end
104
-
105
97
  end
106
-
107
98
  end
@@ -1 +1,4 @@
1
- module Resource end # Namespace for endpoints
1
+ # frozen_string_literal: true
2
+
3
+ # Namespace for endpoints
4
+ module Resource end
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class NessusClient
2
4
  # The current version of the libary.
3
- VERSION = '0.1.4'
5
+ VERSION = '0.1.5'
4
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nessus_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Heyder
@@ -14,16 +14,16 @@ dependencies:
14
14
  name: excon
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0.62'
19
+ version: 0.73.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '0.62'
26
+ version: 0.73.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: oj
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +38,48 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '3.7'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.12'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.12'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.12.2
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.12.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: regexp-examples
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 1.5.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 1.5.0
41
83
  - !ruby/object:Gem::Dependency
42
84
  name: rspec
43
85
  requirement: !ruby/object:Gem::Requirement
@@ -53,50 +95,56 @@ dependencies:
53
95
  - !ruby/object:Gem::Version
54
96
  version: '3.2'
55
97
  - !ruby/object:Gem::Dependency
56
- name: bundler
98
+ name: simplecov
57
99
  requirement: !ruby/object:Gem::Requirement
58
100
  requirements:
59
101
  - - "~>"
60
102
  - !ruby/object:Gem::Version
61
- version: '1.12'
103
+ version: 0.17.0
62
104
  type: :development
63
105
  prerelease: false
64
106
  version_requirements: !ruby/object:Gem::Requirement
65
107
  requirements:
66
108
  - - "~>"
67
109
  - !ruby/object:Gem::Version
68
- version: '1.12'
110
+ version: 0.17.0
69
111
  - !ruby/object:Gem::Dependency
70
- name: pry
112
+ name: codecov
71
113
  requirement: !ruby/object:Gem::Requirement
72
114
  requirements:
73
115
  - - "~>"
74
116
  - !ruby/object:Gem::Version
75
- version: 0.12.2
117
+ version: 0.1.14
76
118
  type: :development
77
119
  prerelease: false
78
120
  version_requirements: !ruby/object:Gem::Requirement
79
121
  requirements:
80
122
  - - "~>"
81
123
  - !ruby/object:Gem::Version
82
- version: 0.12.2
124
+ version: 0.1.14
83
125
  - !ruby/object:Gem::Dependency
84
- name: regexp-examples
126
+ name: yard
85
127
  requirement: !ruby/object:Gem::Requirement
86
128
  requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.9'
87
132
  - - ">="
88
133
  - !ruby/object:Gem::Version
89
- version: 1.5.0
134
+ version: 0.9.20
90
135
  type: :development
91
136
  prerelease: false
92
137
  version_requirements: !ruby/object:Gem::Requirement
93
138
  requirements:
139
+ - - "~>"
140
+ - !ruby/object:Gem::Version
141
+ version: '0.9'
94
142
  - - ">="
95
143
  - !ruby/object:Gem::Version
96
- version: 1.5.0
97
- description: Usable, fast, simple Ruby gem for Tenable Nessus Pro from v7.0.1 to v8.3.1.
98
- NessusClient was designed to be simple, fast and performant through communication
99
- with Nessus over REST interface.
144
+ version: 0.9.20
145
+ description: "\n Usable, fast, simple Ruby gem for Tenable Nessus Pro from v7.0.1
146
+ to v8.3.1.\n NessusClient was designed to be simple, fast and performant through
147
+ communication with Nessus\n over REST interface.\n "
100
148
  email: eu@heyderandrade.org
101
149
  executables: []
102
150
  extensions: []
@@ -141,7 +189,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
189
  - !ruby/object:Gem::Version
142
190
  version: '0'
143
191
  requirements: []
144
- rubygems_version: 3.0.3
192
+ rubygems_version: 3.0.6
145
193
  signing_key:
146
194
  specification_version: 4
147
195
  summary: Usable, fast, simple Ruby gem for Tenable Nessus Pro from v7.0.1 to v8.3.1.