nessus_client 0.1.3 → 0.1.4
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 +15 -11
- data/lib/modules/exports.rb +15 -13
- data/lib/modules/folders.rb +4 -4
- data/lib/modules/policies.rb +2 -2
- data/lib/modules/scans.rb +5 -5
- data/lib/modules/server.rb +15 -0
- data/lib/modules/session.rb +12 -19
- data/lib/modules/tokens.rb +25 -0
- data/lib/nessus_client.rb +23 -20
- data/lib/nessus_client/exception.rb +5 -1
- data/lib/nessus_client/request.rb +63 -51
- data/lib/nessus_client/resource.rb +1 -0
- data/lib/nessus_client/version.rb +1 -1
- metadata +10 -40
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8bd8d8e9586e3b3023b0a0ca4b0cf42c78519ad0b83c7d7a2d0d9b9adaf133bc
|
4
|
+
data.tar.gz: 9734f1945a3daffbd200714f6f736f45d41b3c6d2d3901f35f043775d7a3d6ae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d68ef88707cf6d6e83171a2b4de47d27ce8f6938e6968acbd2aae05836e755017747f917aa3de0792f06b14d8a7fdf6750ad4069d3e51bcb2bba81cd5e30d680
|
7
|
+
data.tar.gz: cf523010cf9bd661dc5ccb708215c4b50d6b0d3f251ecef17d2ae090eecbe0f139bff31d2a2ad87ff33ab647668fd023b0903ee587299ef62dd74f8e8a05caea
|
data/README.md
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
NessusClient
|
2
2
|
=========
|
3
3
|
|
4
|
-
Usable, fast, simple Ruby gem for Tenable Nessus Pro v7.
|
4
|
+
Usable, fast, simple Ruby gem for Tenable Nessus Pro from v7.0.1 to v8.3.1
|
5
5
|
NessusClient was designed to be simple, fast and performant through communication with Nessus over REST interface.
|
6
6
|
|
7
|
-
[](https://badge.fury.io/rb/nessus_client)
|
7
|
+
[](https://badge.fury.io/rb/nessus_client)
|
8
|
+
[](https://codeclimate.com/github/heyder/nessus_client/maintainability)
|
9
|
+
[](https://codecov.io/gh/heyder/nessus_client)
|
10
|
+
[](http://inch-ci.org/github/heyder/nessus_client)
|
8
11
|
|
9
12
|
**Ruby gem for Nessus API**
|
10
13
|
|
@@ -29,29 +32,31 @@ Getting started
|
|
29
32
|
require 'nessus_client'
|
30
33
|
|
31
34
|
nc = NessusClient.new( { :uri=>'https://localhost:8834', :username=>'username',:password=> 'password'} )
|
32
|
-
status =
|
35
|
+
status = nc.server_status
|
36
|
+
puts status
|
37
|
+
puts nc.server_properties
|
33
38
|
|
34
39
|
if status['status'] == 'ready'
|
35
|
-
scan_id = nc.get_scan_by_name('
|
36
|
-
scan_uuid =
|
40
|
+
scan_id = nc.get_scan_by_name('Monthly Scan')
|
41
|
+
scan_uuid = nc.launch_by_name( 'Monthly Scan', ['127.0.0.1'])['scan_uuid']
|
37
42
|
|
38
|
-
|
43
|
+
loop do
|
39
44
|
puts `clear`
|
40
|
-
scan_status =
|
45
|
+
scan_status = nc.scan_details( scan_id )["info"]["status"]
|
41
46
|
puts " #{scan_id} - #{scan_uuid} - #{scan_status} "
|
42
47
|
sleep 5
|
43
48
|
if ["completed","canceled"].include? scan_status
|
44
|
-
export_request =
|
49
|
+
export_request = nc.export_request(scan_id, "nessus" )
|
45
50
|
puts " export request: #{export_request}"
|
46
51
|
while true do
|
47
52
|
puts `clear`
|
48
|
-
export_status =
|
53
|
+
export_status = nc.token_status( export_request['token'])["status"]
|
49
54
|
puts " export status: #{export_status}"
|
50
55
|
sleep 5
|
51
56
|
if export_status == "ready"
|
52
57
|
puts " downloading..."
|
53
58
|
open("scan_report", "wb") do |file|
|
54
|
-
file.write(nc.
|
59
|
+
file.write(nc.token_download( export_request['token'] ))
|
55
60
|
end
|
56
61
|
exit 0
|
57
62
|
end
|
@@ -59,7 +64,6 @@ if status['status'] == 'ready'
|
|
59
64
|
end
|
60
65
|
end
|
61
66
|
end
|
62
|
-
|
63
67
|
```
|
64
68
|
|
65
69
|
## Installation
|
data/lib/modules/exports.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
module NessusClient::Exports
|
2
1
|
|
3
|
-
#
|
2
|
+
module Resource::Exports # Namespace for Exports resource.
|
3
|
+
|
4
|
+
# 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.
|
4
5
|
# @param [String] scan_id The export uuid string.
|
5
6
|
# @param [String] format The file format to use (Nessus, HTML, PDF, CSV, or DB).
|
6
7
|
# @return [JSON]
|
@@ -9,22 +10,23 @@ module NessusClient::Exports
|
|
9
10
|
self.request.post( { :path => "/scans/#{scan_id}/export", :payload => payload, :headers => self.headers} )
|
10
11
|
end
|
11
12
|
|
12
|
-
# Check the status of a export
|
13
|
-
# @param [String]
|
13
|
+
# 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
|
+
# @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
|
+
# @param [String] file_id The ID of the file to poll (Included in response from #export_request).
|
14
16
|
# @return [JSON]
|
15
17
|
# @example Checking the status of a export.
|
16
|
-
# export_status = nc.export_status( "
|
18
|
+
# export_status = nc.export_status( "15", "cd956" )
|
17
19
|
# return true if export_status["status"] == "ready"
|
18
|
-
def export_status(
|
19
|
-
self.request.get( {:path => "/
|
20
|
+
def export_status( scan_id, file_id )
|
21
|
+
self.request.get( {:path => "/scans/#{scan_id}/export/#{file_id}/status", :headers => self.headers} )
|
20
22
|
end
|
21
23
|
|
22
|
-
# Download
|
23
|
-
# @param [
|
24
|
-
# @param [
|
25
|
-
# @return
|
24
|
+
# Download exported scan.
|
25
|
+
# @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'.
|
26
|
+
# @param [String] file_id The ID of the file to poll (Included in response from #export_request).
|
27
|
+
# @return [JSON]
|
26
28
|
# @example Download a ready export.
|
27
|
-
# export = nc.export_download(
|
29
|
+
# export = nc.export_download( '17', '46b78587')
|
28
30
|
# open("scan_report", "wb") do |file|
|
29
31
|
# file.write( export )
|
30
32
|
# end
|
@@ -32,4 +34,4 @@ module NessusClient::Exports
|
|
32
34
|
self.request.get( {:path => "/scans/#{scan_id}/export/#{file_id}/download", :headers => self.headers} )
|
33
35
|
end
|
34
36
|
|
35
|
-
end
|
37
|
+
end
|
data/lib/modules/folders.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
module
|
2
|
-
# Get the list of folders from the
|
1
|
+
module Resource::Folders # Namespace for Folders resource.
|
2
|
+
# Get the list of folders from the resource.
|
3
3
|
# @return [JSON]
|
4
4
|
def list_folders
|
5
5
|
self.request.get({:path => "/folders", :headers => self.headers})
|
6
6
|
end
|
7
|
-
# Create a folder into the
|
7
|
+
# Create a folder into the resource.
|
8
8
|
# @param [String] folder_name The name of the folder the will be created.
|
9
|
-
# @return [
|
9
|
+
# @return [JSON]
|
10
10
|
def create_folder( folder_name )
|
11
11
|
payload = {:name => folder_name }
|
12
12
|
self.request.post({:path=>"/folders", :payload => payload, :headers => self.headers})
|
data/lib/modules/policies.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
module
|
2
|
-
# List the scan polices
|
1
|
+
module Resource::Policies # Namespace for Policies resource.
|
2
|
+
# List the scan polices.
|
3
3
|
# @return [JSON]
|
4
4
|
def policies
|
5
5
|
self.request.get( {:path => "/policies", :headers => self.headers} )
|
data/lib/modules/scans.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
|
2
|
-
module
|
2
|
+
module Resource::Scans # Namespace for Scans resource.
|
3
3
|
|
4
|
-
# List scans from the
|
4
|
+
# List scans from the resource.
|
5
5
|
# @param [String] folder_id (nil) The name of a alredy created scan.
|
6
6
|
# @return [JSON]
|
7
7
|
def list_scans( folder_id=nil )
|
8
8
|
query = folder_id.nil? ? nil : { "folder_id" => folder_id }
|
9
|
-
self.request.get( {:
|
9
|
+
self.request.get( {path: "/scans", query: query, headers: self.headers} )
|
10
10
|
end
|
11
11
|
alias_method :scans, :list_scans
|
12
12
|
|
@@ -23,7 +23,7 @@ module NessusClient::Scans
|
|
23
23
|
# @param [Integer] scan_id The ID of a alredy created scan.
|
24
24
|
# @param [Array<String>] targets comma separeted new target to be scanned.
|
25
25
|
# @return [JSON]
|
26
|
-
def launch( scan_id, targets=[])
|
26
|
+
def launch( scan_id, targets=[] )
|
27
27
|
payload = { :alt_targets => targets } unless targets.empty?
|
28
28
|
self.request.post( {:path => "/scans/#{scan_id}/launch", :payload => payload, :headers => self.headers} )
|
29
29
|
end
|
@@ -42,7 +42,7 @@ module NessusClient::Scans
|
|
42
42
|
# @param [String] scan_name The name of the scan to look for.
|
43
43
|
# @return [String, nil] The uuid of the scan.
|
44
44
|
def get_scan_by_name( folder_id=nil, scan_name )
|
45
|
-
|
45
|
+
list_scans( folder_id )["scans"].each do |scan|
|
46
46
|
return scan['id'] if scan['name'] == scan_name
|
47
47
|
end
|
48
48
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Resource::Server # Namespace for Server resource.
|
2
|
+
|
3
|
+
# 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).
|
5
|
+
def server_status
|
6
|
+
self.request.get( {:path => "/server/status", :headers => self.headers} )
|
7
|
+
end
|
8
|
+
|
9
|
+
# Returns the server version and other properties.
|
10
|
+
# @return [JSON] Returns the server properties
|
11
|
+
def server_properties
|
12
|
+
self.request.get( {:path => "/server/properties", :headers => self.headers} )
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
data/lib/modules/session.rb
CHANGED
@@ -1,16 +1,12 @@
|
|
1
|
-
require 'oj'
|
2
|
-
# Abstract Session class for NessusClient.
|
3
|
-
# @since 0.1.0
|
4
|
-
# @attr_reader [String] token Autentication session token.
|
5
|
-
# @attr_reader [String] api_token Autentication API token.
|
6
|
-
module NessusClient::Session
|
7
1
|
|
2
|
+
module Resource::Session # Namespace for Session resource.
|
3
|
+
|
4
|
+
# @return [Boolean] whether has a session.
|
8
5
|
attr_reader :session
|
9
6
|
|
10
|
-
@@api_token = nil
|
11
7
|
@session = false
|
12
8
|
|
13
|
-
# Autenticate into Nessus
|
9
|
+
# Autenticate into Nessus resource.
|
14
10
|
# @param [String] username
|
15
11
|
# @param [String] password
|
16
12
|
# @return [nil]
|
@@ -23,20 +19,17 @@ module NessusClient::Session
|
|
23
19
|
password: password
|
24
20
|
}
|
25
21
|
|
26
|
-
|
27
|
-
|
28
|
-
response = Oj.load(response) if response.length > 0
|
22
|
+
resp = self.request.post( {path: '/session', payload: payload, headers: self.headers} )
|
29
23
|
|
30
|
-
raise NessusClient::Error.new( "Unable to authenticate. The response did not include a session token." ) unless
|
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})})
|
31
26
|
|
32
27
|
begin
|
33
|
-
self.headers.update( 'X-Cookie' => 'token=' +
|
28
|
+
self.headers.update( 'X-Cookie' => 'token=' + resp["token"] )
|
34
29
|
@session = true
|
35
30
|
self.headers.update( 'X-API-Token' => set_api_token() )
|
36
31
|
rescue NessusClient::Error => err
|
37
32
|
puts err.message
|
38
|
-
else
|
39
|
-
@@api_token = true
|
40
33
|
ensure
|
41
34
|
return
|
42
35
|
end
|
@@ -44,19 +37,19 @@ module NessusClient::Session
|
|
44
37
|
end
|
45
38
|
alias_method :session_create, :set_session
|
46
39
|
|
47
|
-
# Destroy the current session
|
40
|
+
# Destroy the current session.
|
48
41
|
def destroy
|
49
|
-
self.request.delete( '/session',
|
42
|
+
self.request.delete( {path: '/session', headers: self.headers} )
|
50
43
|
@session = false
|
51
44
|
end
|
52
45
|
alias_method :logout , :destroy
|
53
46
|
|
54
47
|
private
|
55
|
-
|
56
48
|
# Set the API Token from legacy Nessus version
|
57
49
|
# @raise [NessusClient::Error] Unable to get API Token.
|
50
|
+
# @todo To get it direct from the session authentication on v6.x
|
58
51
|
def set_api_token
|
59
|
-
response = self.request.get( {:
|
52
|
+
response = self.request.get( {path: "/nessus6.js", headers: self.headers} )
|
60
53
|
response.match( %r{return"(\w{8}-(?:\w{4}-){3}\w{12})"\}} )
|
61
54
|
|
62
55
|
raise NessusClient::Error.new( "Unable to get API Token. Some features won't work." ) unless $1
|
@@ -0,0 +1,25 @@
|
|
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
|
data/lib/nessus_client.rb
CHANGED
@@ -1,26 +1,36 @@
|
|
1
1
|
require_relative 'nessus_client/version'
|
2
2
|
require_relative 'nessus_client/exception'
|
3
|
+
require_relative 'nessus_client/resource'
|
3
4
|
|
4
5
|
Dir[File.join(__dir__, 'modules', '*.rb')].each { |file| require file }
|
5
6
|
|
7
|
+
# Nessus resource abstraction.
|
6
8
|
class NessusClient
|
7
9
|
|
8
|
-
|
10
|
+
# @return [NessusClient::Request] Instance HTTP request object.
|
11
|
+
# @see NessusClient::Request
|
12
|
+
attr_reader :request
|
13
|
+
# @return [Boolean] whether has a session.
|
14
|
+
attr_reader :session
|
15
|
+
# @return [Hash] Instance current HTTP headers.
|
16
|
+
attr_reader :headers
|
9
17
|
|
10
|
-
include
|
11
|
-
include
|
12
|
-
include
|
13
|
-
include
|
14
|
-
include
|
18
|
+
include Resource::Exports
|
19
|
+
include Resource::Folders
|
20
|
+
include Resource::Policies
|
21
|
+
include Resource::Scans
|
22
|
+
include Resource::Server
|
23
|
+
include Resource::Session
|
24
|
+
include Resource::Tokens
|
15
25
|
|
16
26
|
autoload :Request, "nessus_client/request"
|
17
27
|
|
18
28
|
# @param [Hash] params the options to create a NessusClient with.
|
19
|
-
# @option params [String] :uri ('https://localhost:8834/') Nessus
|
20
|
-
# @option params [String] :username
|
21
|
-
# @option params [String] :password
|
22
|
-
# @option params [String] :ssl_verify_peer (
|
23
|
-
def initialize( params
|
29
|
+
# @option params [String] :uri ('https://localhost:8834/') Nessus resource to connect with
|
30
|
+
# @option params [String] :username (nil) Username to use in the connection
|
31
|
+
# @option params [String] :password (nil) Password to use in the connection
|
32
|
+
# @option params [String] :ssl_verify_peer (true) Whether should check valid SSL certificate
|
33
|
+
def initialize( params={} )
|
24
34
|
|
25
35
|
default_params = {
|
26
36
|
uri: 'https://localhost:8834/',
|
@@ -29,25 +39,18 @@ class NessusClient
|
|
29
39
|
ssl_verify_peer: true
|
30
40
|
}
|
31
41
|
params = default_params.merge( params )
|
32
|
-
req_params = params.select {|key, value| [:uri, :ssl_verify_peer].include?(key) }
|
42
|
+
req_params = params.select { |key, value| [:uri, :ssl_verify_peer].include?(key) }
|
33
43
|
|
34
44
|
@request = NessusClient::Request.new( req_params )
|
35
45
|
@headers = NessusClient::Request::DEFAULT_HEADERS.dup
|
36
46
|
self.set_session( params.fetch(:username), params.fetch(:password) )
|
37
47
|
|
38
|
-
|
39
48
|
end
|
40
49
|
|
41
50
|
# Gets NessusClient::Session authentication status.
|
42
|
-
# @return [Boolean]
|
51
|
+
# @return [Boolean] whether NessusClient has successfully authenticated.
|
43
52
|
def has_session?
|
44
53
|
self.session
|
45
54
|
end
|
46
55
|
|
47
|
-
# Gets the server status.
|
48
|
-
# @return [Json] Returns the server status (loading, ready, corrupt-db, feed-expired, eval-expired, locked, register, register-locked, download-failed, feed-error).
|
49
|
-
def status
|
50
|
-
self.request.get( {:path => "/server/status", :headers => self.headers} )
|
51
|
-
end
|
52
|
-
|
53
56
|
end
|
@@ -1,7 +1,11 @@
|
|
1
1
|
class NessusClient
|
2
2
|
# Abstract Error class for NessusClient.
|
3
3
|
class Error < ::StandardError
|
4
|
-
|
4
|
+
# Raise a custom error namespace.
|
5
|
+
# @param [String] msg The exception message.
|
6
|
+
# @example
|
7
|
+
# NessusClient::Error.new('This is a custom error.')
|
8
|
+
def initialize( msg )
|
5
9
|
super
|
6
10
|
end
|
7
11
|
end
|
@@ -1,56 +1,60 @@
|
|
1
1
|
require 'excon'
|
2
|
-
require '
|
2
|
+
require 'oj'
|
3
3
|
|
4
4
|
class NessusClient
|
5
5
|
|
6
|
-
# Abstract request class for NessusClient. Provides some helper methods for
|
6
|
+
# Abstract http request class for NessusClient. Provides some helper methods for perform HTTP requests.
|
7
7
|
class Request
|
8
|
-
|
8
|
+
# @return [String] The base url of the API.
|
9
9
|
attr_reader :url
|
10
10
|
|
11
11
|
# Default HTTP header to be used on the requests.
|
12
12
|
DEFAULT_HEADERS = {
|
13
|
-
"User-Agent"
|
14
|
-
"Content-Type"
|
13
|
+
"User-Agent" => "NessusClient::Request (https://rubygems.org/gems/nessus_client)",
|
14
|
+
"Content-Type" => "application/json"
|
15
15
|
}.freeze
|
16
16
|
|
17
|
-
|
18
|
-
|
17
|
+
# @param [Hash] params the options to create a NessusClient::Request with.
|
18
|
+
# @option params [String] :uri ('https://localhost:8834/') Nessus server to connect with
|
19
|
+
# @option params [String] :ssl_verify_peer (true) Whether should check valid SSL certificate
|
20
|
+
def initialize( params={} )
|
19
21
|
params = {:uri => nil }.merge( params )
|
20
22
|
@@ssl_verify_peer = params[:ssl_verify_peer] ? true : false
|
21
23
|
@url = @@url = NessusClient::Request.uri_parse( params.fetch(:uri) )
|
22
24
|
end
|
23
25
|
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
|
29
|
-
#
|
30
|
-
# @param [String] path The URI path to perform the request.
|
31
|
-
# @param [String] payload The HTTP body to send.
|
32
|
-
# @param [String] query The URI query to send.
|
26
|
+
# Perform a HTTP GET request.
|
27
|
+
# @param [Hash] opts to use in the request.
|
28
|
+
# @option opts [String] path The URI path to perform the request.
|
29
|
+
# @option opts [String] payload The HTTP body to send.
|
30
|
+
# @option opts [String] query The URI query to send.
|
31
|
+
# @return [JSON] The body of the resposnse if there is any.
|
33
32
|
def get( opts={} )
|
34
33
|
http_request( :get, opts )
|
35
34
|
end
|
36
35
|
|
37
|
-
# Perform a HTTP POST
|
38
|
-
# @param [
|
39
|
-
# @
|
40
|
-
# @
|
36
|
+
# Perform a HTTP POST request.
|
37
|
+
# @param [Hash] opts to use in the request.
|
38
|
+
# @option opts [String] path The URI path to perform the request.
|
39
|
+
# @option opts [String] payload The HTTP body to send.
|
40
|
+
# @option opts [String] query The URI query to send.
|
41
|
+
# @return [JSON] The body of the resposnse if there is any.
|
41
42
|
def post( opts={} )
|
42
43
|
http_request( :post, opts )
|
43
44
|
end
|
44
45
|
|
45
|
-
# Perform a HTTP DELETE
|
46
|
-
# @param [
|
47
|
-
# @
|
48
|
-
# @
|
46
|
+
# Perform a HTTP DELETE request.
|
47
|
+
# @param [Hash] opts to use in the request.
|
48
|
+
# @option opts [String] path The URI path to perform the request.
|
49
|
+
# @option opts [String] payload The HTTP body to send.
|
50
|
+
# @option opts [String] query The URI query to send.
|
51
|
+
# @return [JSON] The body of the resposnse if there is any.
|
49
52
|
def delete( opts={} )
|
50
53
|
http_request( :delete, opts )
|
51
54
|
end
|
52
|
-
|
53
|
-
#
|
55
|
+
|
56
|
+
# Parse a receiveid string against the URI stantard.
|
57
|
+
# @param [String] uri A string to be validate URI.
|
54
58
|
# @return [String] A string uri.
|
55
59
|
def self.uri_parse( uri )
|
56
60
|
url = URI.parse( uri )
|
@@ -59,35 +63,43 @@ class NessusClient
|
|
59
63
|
end
|
60
64
|
|
61
65
|
private
|
62
|
-
|
63
66
|
# @private HTTP request abstraction to be used.
|
64
|
-
# @param [Symbol] method
|
65
|
-
# @param [
|
66
|
-
# @
|
67
|
-
# @
|
67
|
+
# @param [Symbol] method The HTTP method to be used on the request.
|
68
|
+
# @param [Hash] args Parameters to use in the request.
|
69
|
+
# @option args [String] path (nil) The URI path to perform the request.
|
70
|
+
# @option args [String] payload (nil) The HTTP body to send.
|
71
|
+
# @option args [String] query (nil) The URI query to send.
|
72
|
+
# @option args [String] headers (nil) The headers to send.
|
73
|
+
# @return [JSON] The body of the resposnse if there is any.
|
68
74
|
def http_request( method=:get, args )
|
69
|
-
|
70
|
-
:path => nil,
|
71
|
-
:payload => nil,
|
72
|
-
:query => nil,
|
73
|
-
:headers => nil
|
74
|
-
}.merge( args )
|
75
|
+
begin
|
75
76
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
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
|
+
}
|
90
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
|
91
103
|
end
|
92
104
|
|
93
105
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
module Resource end # Namespace for endpoints
|
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
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Heyder
|
@@ -81,54 +81,21 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 0.12.2
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: regexp-examples
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: 0.17.0
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: 0.17.0
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: codecov
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - "~>"
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: 0.1.14
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - "~>"
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: 0.1.14
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: yard
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - "~>"
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0.9'
|
118
87
|
- - ">="
|
119
88
|
- !ruby/object:Gem::Version
|
120
|
-
version:
|
89
|
+
version: 1.5.0
|
121
90
|
type: :development
|
122
91
|
prerelease: false
|
123
92
|
version_requirements: !ruby/object:Gem::Requirement
|
124
93
|
requirements:
|
125
|
-
- - "~>"
|
126
|
-
- !ruby/object:Gem::Version
|
127
|
-
version: '0.9'
|
128
94
|
- - ">="
|
129
95
|
- !ruby/object:Gem::Version
|
130
|
-
version:
|
131
|
-
description:
|
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
|
132
99
|
with Nessus over REST interface.
|
133
100
|
email: eu@heyderandrade.org
|
134
101
|
executables: []
|
@@ -145,10 +112,13 @@ files:
|
|
145
112
|
- lib/modules/folders.rb
|
146
113
|
- lib/modules/policies.rb
|
147
114
|
- lib/modules/scans.rb
|
115
|
+
- lib/modules/server.rb
|
148
116
|
- lib/modules/session.rb
|
117
|
+
- lib/modules/tokens.rb
|
149
118
|
- lib/nessus_client.rb
|
150
119
|
- lib/nessus_client/exception.rb
|
151
120
|
- lib/nessus_client/request.rb
|
121
|
+
- lib/nessus_client/resource.rb
|
152
122
|
- lib/nessus_client/version.rb
|
153
123
|
homepage: https://github.com/heyder/nessus_client
|
154
124
|
licenses:
|
@@ -174,5 +144,5 @@ requirements: []
|
|
174
144
|
rubygems_version: 3.0.3
|
175
145
|
signing_key:
|
176
146
|
specification_version: 4
|
177
|
-
summary: Usable, fast, simple Ruby gem for Tenable Nessus Pro
|
147
|
+
summary: Usable, fast, simple Ruby gem for Tenable Nessus Pro from v7.0.1 to v8.3.1.
|
178
148
|
test_files: []
|