Nessus6 0.1.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.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/Nessus6.gemspec +28 -0
- data/README.md +39 -0
- data/Rakefile +1 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/lib/Nessus6.rb +63 -0
- data/lib/Nessus6/editor/methods.rb +108 -0
- data/lib/Nessus6/errors/bad_request.rb +7 -0
- data/lib/Nessus6/errors/conflict.rb +6 -0
- data/lib/Nessus6/errors/forbidden.rb +6 -0
- data/lib/Nessus6/errors/internal_server_error.rb +5 -0
- data/lib/Nessus6/errors/not_found.rb +6 -0
- data/lib/Nessus6/errors/unauthorized.rb +8 -0
- data/lib/Nessus6/errors/unknown.rb +4 -0
- data/lib/Nessus6/file/methods.rb +34 -0
- data/lib/Nessus6/folders/methods.rb +100 -0
- data/lib/Nessus6/groups/methods.rb +167 -0
- data/lib/Nessus6/permissions/methods.rb +54 -0
- data/lib/Nessus6/scans/methods.rb +88 -0
- data/lib/Nessus6/session/methods.rb +142 -0
- data/lib/Nessus6/users/methods.rb +180 -0
- data/lib/Nessus6/version.rb +3 -0
- metadata +125 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4fd4cdfa535bfd5f763074b2364aec98c58c128b
|
4
|
+
data.tar.gz: ea9e76b76ec8b8944933bd4258cd6460b3daac07
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: aa72aa5257c78b7751279ff72cf953e46c3a8b05b71d419988059245e772ecd5c75b3e8937c1a811c3d329ab41a067037dc8391578f4a9e63ab22cac264d01d4
|
7
|
+
data.tar.gz: 3c7d133ebdc754dcff55b64e57a31129abc4a28cc2286176e0f393253c343ced1e294c831bc23373a5df781d571e923e103deb7670ca031802a938902dd196b1
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Nessus6.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'Nessus6/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "Nessus6"
|
8
|
+
spec.version = Nessus6::VERSION
|
9
|
+
spec.authors = ["Kevin Kirsche"]
|
10
|
+
spec.email = ["kev.kirsche@gmail.com"]
|
11
|
+
spec.license = 'Apache-2.0'
|
12
|
+
|
13
|
+
spec.summary = %q{[Under Construction] Nessus 6 API Gem}
|
14
|
+
spec.description = %q{Gem for interacting with the Tenable Nessus 6 REST API.}
|
15
|
+
spec.homepage = "https://github.com/kkirsche/Nessus6"
|
16
|
+
|
17
|
+
spec.required_ruby_version = '>= 2.0.0'
|
18
|
+
|
19
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
20
|
+
spec.bindir = "exe"
|
21
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
|
+
spec.require_paths = ["lib"]
|
23
|
+
|
24
|
+
spec.add_development_dependency "bundler", "~> 1.9"
|
25
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
26
|
+
spec.add_development_dependency "minitest", "~> 5.8"
|
27
|
+
spec.add_runtime_dependency "hurley", "~> 0.1"
|
28
|
+
end
|
data/README.md
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# Nessus6
|
2
|
+
|
3
|
+
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/Nessus6`. To experiment with that code, run `bin/console` for an interactive prompt.
|
4
|
+
|
5
|
+
TODO: Delete this and the text above, and describe your gem
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'Nessus6'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install Nessus6
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
TODO: Write usage instructions here
|
26
|
+
|
27
|
+
## Development
|
28
|
+
|
29
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
|
30
|
+
|
31
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
32
|
+
|
33
|
+
## Contributing
|
34
|
+
|
35
|
+
1. Fork it ( https://github.com/[my-github-username]/Nessus6/fork )
|
36
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
37
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
38
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
39
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "Nessus6"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
data/lib/Nessus6.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'hurley'
|
2
|
+
require 'Nessus6/version'
|
3
|
+
require 'Nessus6/editor/methods'
|
4
|
+
require 'Nessus6/session/methods'
|
5
|
+
require 'Nessus6/users/methods'
|
6
|
+
require 'Nessus6/file/methods'
|
7
|
+
require 'Nessus6/folders/methods'
|
8
|
+
require 'Nessus6/groups/methods'
|
9
|
+
require 'Nessus6/permissions/methods'
|
10
|
+
require 'Nessus6/scans/methods'
|
11
|
+
|
12
|
+
module Nessus6
|
13
|
+
# The Client class is used to interact with the Nessus API
|
14
|
+
class Client
|
15
|
+
attr_reader :client, :editor, :session, :users, :file, :folders, :groups,
|
16
|
+
:permissions, :scans
|
17
|
+
|
18
|
+
def initialize(credentials, nessus)
|
19
|
+
nessus[:port] = '8834' unless nessus.key?(:port)
|
20
|
+
|
21
|
+
# Create our client
|
22
|
+
@client = Hurley::Client.new 'https://' + nessus[:ip] + ':' + nessus[:port]
|
23
|
+
@client.ssl_options.skip_verification = true
|
24
|
+
|
25
|
+
authenticate credentials
|
26
|
+
|
27
|
+
build_clients @client
|
28
|
+
|
29
|
+
@client
|
30
|
+
end
|
31
|
+
|
32
|
+
def authenticate(credentials)
|
33
|
+
# Open up a session and get our token so we can make queries
|
34
|
+
@session = Nessus6::Session.new @client
|
35
|
+
if credentials[:username] && credentials[:password]
|
36
|
+
@token = @session.create(credentials[:username], credentials[:password])
|
37
|
+
@client.header['X-Cookie'] = "token = #{@token}"
|
38
|
+
elsif credentials[:access_key] && credentials[:secret_key]
|
39
|
+
else
|
40
|
+
fail AuthenticationError, 'Authentication credentials not provided. ' \
|
41
|
+
'Must provided either username and password or access key and' \
|
42
|
+
' secret key.'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def logout
|
47
|
+
@session.destroy
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def build_clients(client)
|
53
|
+
@session = Nessus6::Session.new client
|
54
|
+
@editor = Nessus6::Editor.new client
|
55
|
+
@users = Nessus6::Users.new client
|
56
|
+
@file = Nessus6::File.new client
|
57
|
+
@folders = Nessus6::Folders.new client
|
58
|
+
@groups = Nessus6::Groups.new client
|
59
|
+
@permissions = Nessus6::Permissions.new client
|
60
|
+
@scans = Nessus6::Scans.new client
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'Nessus6/errors/forbidden'
|
3
|
+
require 'Nessus6/errors/not_found'
|
4
|
+
require 'Nessus6/errors/unknown'
|
5
|
+
|
6
|
+
module Nessus6
|
7
|
+
# The Editor class is for interacting with Nessus6 templates
|
8
|
+
class Editor
|
9
|
+
def initialize(client)
|
10
|
+
@client = client
|
11
|
+
end
|
12
|
+
|
13
|
+
def audits(type, object_id, file_id)
|
14
|
+
response = @client.get("editor/#{type}/#{object_id}/audits/#{file_id}")
|
15
|
+
verify_audits response
|
16
|
+
end
|
17
|
+
|
18
|
+
def details(type, template_uuid)
|
19
|
+
response = @client.get("editor/#{type}/templates/#{template_uuid}")
|
20
|
+
verify_details response
|
21
|
+
end
|
22
|
+
|
23
|
+
def edit(type, id)
|
24
|
+
response = @client.get("editor/#{type}/#{id}")
|
25
|
+
verify_edit response
|
26
|
+
end
|
27
|
+
|
28
|
+
def list(type)
|
29
|
+
response = @client.get("editor/#{type}/templates")
|
30
|
+
verify response
|
31
|
+
end
|
32
|
+
|
33
|
+
def plugin_description(policy_id, family_id, plugin_id)
|
34
|
+
response = @client.get("editor/policy/#{policy_id}/families/#{family_id}/plugins/#{plugin_id}")
|
35
|
+
verify_plugin_description response
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def verify_audits(response)
|
41
|
+
case response.status_code
|
42
|
+
when 200
|
43
|
+
return JSON.parse response.body
|
44
|
+
when 403
|
45
|
+
fail ForbiddenError,
|
46
|
+
'You do not have permission to export the audit file'
|
47
|
+
when 404
|
48
|
+
fail NotFoundError, 'Audit file does not exist'
|
49
|
+
else
|
50
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
51
|
+
'for further details.'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def verify_details(response)
|
56
|
+
case response.status_code
|
57
|
+
when 200
|
58
|
+
return JSON.parse response.body
|
59
|
+
when 403
|
60
|
+
fail ForbiddenError,
|
61
|
+
'You do not have permission to open the template'
|
62
|
+
when 404
|
63
|
+
fail NotFoundError, 'Template does not exist'
|
64
|
+
else
|
65
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
66
|
+
'for further details.'
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def verify_edit(response)
|
71
|
+
case response.status_code
|
72
|
+
when 200
|
73
|
+
return JSON.parse response.body
|
74
|
+
when 403
|
75
|
+
fail ForbiddenError,
|
76
|
+
'You do not have permission to open the object'
|
77
|
+
when 404
|
78
|
+
fail NotFoundError, 'Object does not exist'
|
79
|
+
else
|
80
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
81
|
+
'for further details.'
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def verify_list(response)
|
86
|
+
case response.status_code
|
87
|
+
when 200
|
88
|
+
return JSON.parse response.body
|
89
|
+
when 403
|
90
|
+
fail ForbiddenError,
|
91
|
+
'You do not have permission to view the list'
|
92
|
+
else
|
93
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
94
|
+
'for further details.'
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def verify_plugin_description(response)
|
99
|
+
case response.status_code
|
100
|
+
when 200
|
101
|
+
return JSON.parse response.body
|
102
|
+
else
|
103
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
104
|
+
'for further details.'
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
# BadRequestError represents HTTP 400 Responses
|
2
|
+
# The server cannot or will not process the request
|
3
|
+
# due to something that is perceived to be a client
|
4
|
+
# error (e.g. malformed request syntax, invalid request
|
5
|
+
# message framing, or deceptive request routing)
|
6
|
+
class BadRequestError < StandardError
|
7
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
# UnauthorizedError represents HTTP 401 Responses
|
2
|
+
# Similar to 403 Forbidden, but specifically for use
|
3
|
+
# when authentication is required and has failed or has
|
4
|
+
# not yet been provided. The response must include a
|
5
|
+
# WWW-Authenticate header field containing a challenge
|
6
|
+
# applicable to the requested resource
|
7
|
+
class UnauthorizedError < StandardError
|
8
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'hurley'
|
3
|
+
require 'Nessus6/errors/internal_server_error'
|
4
|
+
require 'Nessus6/errors/unknown'
|
5
|
+
|
6
|
+
module Nessus6
|
7
|
+
# The Editor class is for interacting with Nessus6 templates
|
8
|
+
class File
|
9
|
+
def initialize(client)
|
10
|
+
@client = client
|
11
|
+
end
|
12
|
+
|
13
|
+
def upload(file_path, file_type, encrypted = 0)
|
14
|
+
response = @client.post('file/upload',
|
15
|
+
file: Hurley::UploadIO.new(file_path, file_type),
|
16
|
+
no_enc: encrypted)
|
17
|
+
verify_upload response
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def verify_upload(response)
|
23
|
+
case response.status_code
|
24
|
+
when 200
|
25
|
+
return JSON.parse response.body
|
26
|
+
when 500
|
27
|
+
fail InternalServerError, 'File failed to upload'
|
28
|
+
else
|
29
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
30
|
+
'for further details.'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'Nessus6/errors/internal_server_error'
|
3
|
+
require 'Nessus6/errors/forbidden'
|
4
|
+
require 'Nessus6/errors/bad_request'
|
5
|
+
require 'Nessus6/errors/not_found'
|
6
|
+
require 'Nessus6/errors/unknown'
|
7
|
+
|
8
|
+
module Nessus6
|
9
|
+
# The Editor class is for interacting with Nessus6 templates
|
10
|
+
class Folders
|
11
|
+
def initialize(client)
|
12
|
+
@client = client
|
13
|
+
end
|
14
|
+
|
15
|
+
def create(name)
|
16
|
+
response = @client.post('folders', name: name)
|
17
|
+
verify_create response
|
18
|
+
end
|
19
|
+
|
20
|
+
def delete(folder_id)
|
21
|
+
response = @client.delete("folders/#{folder_id}")
|
22
|
+
verify_delete response
|
23
|
+
end
|
24
|
+
|
25
|
+
def edit(folder_id, name)
|
26
|
+
response = @client.put("folders/#{folder_id}", name: name)
|
27
|
+
verify_edit response
|
28
|
+
end
|
29
|
+
|
30
|
+
alias_method :rename, :edit
|
31
|
+
|
32
|
+
def list
|
33
|
+
response = @client.get('folders')
|
34
|
+
verify_list response
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def verify_create(response)
|
40
|
+
case response.status_code
|
41
|
+
when 200
|
42
|
+
return JSON.parse response.body
|
43
|
+
when 400
|
44
|
+
fail BadRequestError, 'Folder name is invalid'
|
45
|
+
when 403
|
46
|
+
fail ForbiddenError, 'You do not have permission to create a folder'
|
47
|
+
when 500
|
48
|
+
fail InternalServerError, 'Server failed to create the folder'
|
49
|
+
else
|
50
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
51
|
+
'for further details.'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def verify_delete(response)
|
56
|
+
case response.status_code
|
57
|
+
when 200
|
58
|
+
return JSON.parse response.body
|
59
|
+
when 403
|
60
|
+
fail ForbiddenError, 'Cannot delete a system folder'
|
61
|
+
when 404
|
62
|
+
fail NotFoundError, 'Folder does not exist'
|
63
|
+
when 500
|
64
|
+
fail InternalServerError, 'Server failed to delete the folder'
|
65
|
+
else
|
66
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
67
|
+
'for further details.'
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def verify_edit(response)
|
72
|
+
case response.status_code
|
73
|
+
when 200
|
74
|
+
return JSON.parse response.body
|
75
|
+
when 403
|
76
|
+
fail ForbiddenError, 'Cannot rename a system folder'
|
77
|
+
when 404
|
78
|
+
fail NotFoundError, 'Folder does not exist'
|
79
|
+
when 500
|
80
|
+
fail InternalServerError, 'Server failed to rename the folder'
|
81
|
+
else
|
82
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
83
|
+
'for further details.'
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def verify_list(response)
|
88
|
+
case response.status_code
|
89
|
+
when 200
|
90
|
+
return JSON.parse response.body
|
91
|
+
when 403
|
92
|
+
fail ForbiddenError,
|
93
|
+
'You do not have permission to view the folder list'
|
94
|
+
else
|
95
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
96
|
+
'for further details.'
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,167 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'Nessus6/errors/internal_server_error' # 500
|
3
|
+
require 'Nessus6/errors/forbidden' # 403
|
4
|
+
require 'Nessus6/errors/bad_request' # 400
|
5
|
+
require 'Nessus6/errors/not_found' # 404
|
6
|
+
require 'Nessus6/errors/unknown'
|
7
|
+
|
8
|
+
module Nessus6
|
9
|
+
# The Editor class is for interacting with Nessus6 templates
|
10
|
+
class Groups
|
11
|
+
def initialize(client)
|
12
|
+
@client = client
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_user(group_id, user_id)
|
16
|
+
response = @client.post("groups/#{group_id}/users/#{user_id}")
|
17
|
+
verify_add_user response
|
18
|
+
end
|
19
|
+
|
20
|
+
def create(name)
|
21
|
+
response = @client.post('groups', name: name)
|
22
|
+
verify_create response
|
23
|
+
end
|
24
|
+
|
25
|
+
def delete(group_id)
|
26
|
+
response = @client.delete("groups/#{group_id}")
|
27
|
+
verify_delete response
|
28
|
+
end
|
29
|
+
|
30
|
+
def delete_user(group_id, user_id)
|
31
|
+
response = @client.delete("groups/#{group_id}/users/#{user_id}")
|
32
|
+
verify_delete_user response
|
33
|
+
end
|
34
|
+
|
35
|
+
def edit(group_id, name)
|
36
|
+
response = @client.put("groups/#{group_id}", name: name)
|
37
|
+
verify_edit response
|
38
|
+
end
|
39
|
+
|
40
|
+
alias_method :rename, :edit
|
41
|
+
|
42
|
+
def list
|
43
|
+
response = @client.get('groups')
|
44
|
+
verify_list response
|
45
|
+
end
|
46
|
+
|
47
|
+
def list_users(group_id)
|
48
|
+
response = @client.get("groups/#{group_id}/users")
|
49
|
+
verify_list_users response
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def verify_add_user(response)
|
55
|
+
case response.status_code
|
56
|
+
when 200
|
57
|
+
return JSON.parse response.body
|
58
|
+
when 403
|
59
|
+
fail ForbiddenError,
|
60
|
+
'You do not have permission to add users to a group'
|
61
|
+
when 404
|
62
|
+
fail NotFoundError, 'Group or user does not exist'
|
63
|
+
when 500
|
64
|
+
fail InternalServerError, 'Server failed to add the user to the group'
|
65
|
+
else
|
66
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
67
|
+
'for further details.'
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def verify_create(response)
|
72
|
+
case response.status_code
|
73
|
+
when 200
|
74
|
+
return JSON.parse response.body
|
75
|
+
when 400
|
76
|
+
fail BadRequestError, 'Field is invalid'
|
77
|
+
when 403
|
78
|
+
fail ForbiddenError, 'You do not have permission to create a group'
|
79
|
+
when 500
|
80
|
+
fail InternalServerError, 'Server failed to create the group'
|
81
|
+
else
|
82
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
83
|
+
'for further details.'
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def verify_delete(response)
|
88
|
+
case response.status_code
|
89
|
+
when 200
|
90
|
+
return JSON.parse response.body
|
91
|
+
when 400
|
92
|
+
fail BadRequestError, 'Group does not exist'
|
93
|
+
when 403
|
94
|
+
fail ForbiddenError, 'You do not have permission to delete the group'
|
95
|
+
when 500
|
96
|
+
fail InternalServerError, 'Server failed to delete the group'
|
97
|
+
else
|
98
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
99
|
+
'for further details.'
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def verify_delete_user(response)
|
104
|
+
case response.status_code
|
105
|
+
when 200
|
106
|
+
return JSON.parse response.body
|
107
|
+
when 403
|
108
|
+
fail ForbiddenError,
|
109
|
+
'You do not have permission to delete users from a group'
|
110
|
+
when 404
|
111
|
+
fail NotFoundError, 'Group or user does not exist'
|
112
|
+
when 500
|
113
|
+
fail InternalServerError,
|
114
|
+
'Server failed to remove the user from the group'
|
115
|
+
else
|
116
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
117
|
+
'for further details.'
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def verify_edit(response)
|
122
|
+
case response.status_code
|
123
|
+
when 200
|
124
|
+
return JSON.parse response.body
|
125
|
+
when 400
|
126
|
+
fail BadRequestError, 'Field is invalid'
|
127
|
+
when 403
|
128
|
+
fail ForbiddenError, 'You do not have permission to edit a group'
|
129
|
+
when 404
|
130
|
+
fail NotFoundError, 'Group does not exist'
|
131
|
+
when 500
|
132
|
+
fail InternalServerError, 'Server failed to edit / rename the group'
|
133
|
+
else
|
134
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
135
|
+
'for further details.'
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def verify_list(response)
|
140
|
+
case response.status_code
|
141
|
+
when 200
|
142
|
+
return JSON.parse response.body
|
143
|
+
when 403
|
144
|
+
fail ForbiddenError,
|
145
|
+
'You do not have permission to view the groups list'
|
146
|
+
else
|
147
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
148
|
+
'for further details.'
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def verify_list_users(response)
|
153
|
+
case response.status_code
|
154
|
+
when 200
|
155
|
+
return JSON.parse response.body
|
156
|
+
when 403
|
157
|
+
fail ForbiddenError,
|
158
|
+
'You do not have permission to view the groups users list'
|
159
|
+
when 404
|
160
|
+
fail NotFoundError, 'Group does not exist'
|
161
|
+
else
|
162
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
163
|
+
'for further details.'
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'Nessus6/errors/forbidden' # 403
|
3
|
+
require 'Nessus6/errors/not_found' # 404
|
4
|
+
require 'Nessus6/errors/unknown'
|
5
|
+
|
6
|
+
module Nessus6
|
7
|
+
# The Editor class is for interacting with Nessus6 templates
|
8
|
+
class Permissions
|
9
|
+
def initialize(client)
|
10
|
+
@client = client
|
11
|
+
end
|
12
|
+
|
13
|
+
def change(object_type, object_id, permissions)
|
14
|
+
response = @client.put("permissions/#{object_type}/#{object_id}",
|
15
|
+
body: permissions)
|
16
|
+
verify_change response
|
17
|
+
end
|
18
|
+
|
19
|
+
def list(object_type, object_id)
|
20
|
+
response = @client.get("permissions/#{object_type}/#{object_id}")
|
21
|
+
verify_list response
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def verify_change(response)
|
27
|
+
case response.status_code
|
28
|
+
when 200
|
29
|
+
return JSON.parse response.body
|
30
|
+
when 403
|
31
|
+
fail ForbiddenError, 'You do not have permission to edit the object'
|
32
|
+
when 404
|
33
|
+
fail NotFoundError, 'Object does not exist'
|
34
|
+
else
|
35
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
36
|
+
'for further details.'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def verify_list(response)
|
41
|
+
case response.status_code
|
42
|
+
when 200
|
43
|
+
return JSON.parse response.body
|
44
|
+
when 403
|
45
|
+
fail ForbiddenError, 'You do not have permission to view the object'
|
46
|
+
when 404
|
47
|
+
fail NotFoundError, 'Object does not exist'
|
48
|
+
else
|
49
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
50
|
+
'for further details.'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'Nessus6/errors/forbidden' # 403
|
3
|
+
require 'Nessus6/errors/not_found' # 404
|
4
|
+
require 'Nessus6/errors/conflict' # 409
|
5
|
+
require 'Nessus6/errors/internal_server_error' # 500
|
6
|
+
require 'Nessus6/errors/unknown'
|
7
|
+
|
8
|
+
module Nessus6
|
9
|
+
# The Editor class is for interacting with Nessus6 templates
|
10
|
+
class Scans
|
11
|
+
def initialize(client)
|
12
|
+
@client = client
|
13
|
+
end
|
14
|
+
|
15
|
+
def launch(scan_id, alt_targets = nil)
|
16
|
+
if alt_targets.is_a? Array
|
17
|
+
response = @client.post "scans/#{scan_id}/launch",
|
18
|
+
alt_targets: alt_targets
|
19
|
+
else
|
20
|
+
response = @client.post "scans/#{scan_id}/launch"
|
21
|
+
end
|
22
|
+
|
23
|
+
verify_launch response
|
24
|
+
end
|
25
|
+
|
26
|
+
def list
|
27
|
+
response = @client.get 'scans'
|
28
|
+
JSON.parse response.body
|
29
|
+
end
|
30
|
+
|
31
|
+
def pause(scan_id)
|
32
|
+
response = @client.post "scans/#{scan_id}/pause"
|
33
|
+
verify_pause response
|
34
|
+
end
|
35
|
+
|
36
|
+
def stop(scan_id)
|
37
|
+
response = @client.post "scans/#{scan_id}/stop"
|
38
|
+
verify_stop response
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def verify_launch(response)
|
44
|
+
case response.status_code
|
45
|
+
when 200
|
46
|
+
return JSON.parse response.body
|
47
|
+
when 403
|
48
|
+
fail ForbiddenError, 'This scan is disabled.'
|
49
|
+
when 404
|
50
|
+
fail NotFoundError, 'Scan does not exist.'
|
51
|
+
when 500
|
52
|
+
fail InternalServerError, 'Failed to launch scan. This is usually due to the'\
|
53
|
+
' scan already running.'
|
54
|
+
else
|
55
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
56
|
+
'for further details.'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def verify_pause(response)
|
61
|
+
case response.status_code
|
62
|
+
when 200
|
63
|
+
return JSON.parse response.body
|
64
|
+
when 403
|
65
|
+
fail ForbiddenError, 'This scan is disabled.'
|
66
|
+
when 409
|
67
|
+
fail ConflictError, 'Scan is not active.'
|
68
|
+
else
|
69
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
70
|
+
'for further details.'
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def verify_stop(response)
|
75
|
+
case response.status_code
|
76
|
+
when 200
|
77
|
+
return JSON.parse response.body
|
78
|
+
when 404
|
79
|
+
fail NotFoundError, 'Scan does not exist.'
|
80
|
+
when 409
|
81
|
+
fail ConflictError, 'Scan is not active.'
|
82
|
+
else
|
83
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
84
|
+
'for further details.'
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'Nessus6/errors/bad_request'
|
3
|
+
require 'Nessus6/errors/forbidden'
|
4
|
+
require 'Nessus6/errors/internal_server_error'
|
5
|
+
require 'Nessus6/errors/unauthorized'
|
6
|
+
require 'Nessus6/errors/unknown'
|
7
|
+
|
8
|
+
module Nessus6
|
9
|
+
class Session
|
10
|
+
attr_reader :token
|
11
|
+
|
12
|
+
def initialize(client)
|
13
|
+
@client = client
|
14
|
+
end
|
15
|
+
|
16
|
+
def create(username, password)
|
17
|
+
response = @client.post('session',
|
18
|
+
username: username, password: password)
|
19
|
+
verified = verify_create response
|
20
|
+
@token = verified['token']
|
21
|
+
end
|
22
|
+
|
23
|
+
def destroy
|
24
|
+
response = @client.delete('session')
|
25
|
+
|
26
|
+
case response.status_code
|
27
|
+
when 200
|
28
|
+
@token = ''
|
29
|
+
return true
|
30
|
+
when 401
|
31
|
+
fail 'No session exists'
|
32
|
+
else
|
33
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
34
|
+
'for further details.'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def edit(user)
|
39
|
+
if user[:name] && user[:email]
|
40
|
+
response = @client.put('session', name: user[:name],
|
41
|
+
email: user[:email])
|
42
|
+
elsif user[:name]
|
43
|
+
response = @client.put('session', name: user[:name])
|
44
|
+
elsif user[:email]
|
45
|
+
response = @client.put('session', email: user[:email])
|
46
|
+
else
|
47
|
+
fail "User's name or email was not provided in hash form."
|
48
|
+
end
|
49
|
+
verify_edit response
|
50
|
+
end
|
51
|
+
|
52
|
+
def get
|
53
|
+
verify_get @client.get('session')
|
54
|
+
end
|
55
|
+
|
56
|
+
def password(new_password)
|
57
|
+
response = @client.put('session/chpasswd', password: new_password)
|
58
|
+
verify_password response
|
59
|
+
end
|
60
|
+
|
61
|
+
def keys
|
62
|
+
response = @client.put('session/keys')
|
63
|
+
verify_keys response
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def verify_create(response)
|
69
|
+
case response.status_code
|
70
|
+
when 200
|
71
|
+
return JSON.parse response.body
|
72
|
+
when 400
|
73
|
+
fail BadRequestError, 'Username format is not valid'
|
74
|
+
when 401
|
75
|
+
fail UnauthorizedError, 'Username or password is invalid'
|
76
|
+
when 500
|
77
|
+
fail InternalServerError, 'Too many users are connected'
|
78
|
+
else
|
79
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
80
|
+
'for further details.'
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def verify_edit(response)
|
85
|
+
case response.status_code
|
86
|
+
when 200
|
87
|
+
return JSON.parse response.body
|
88
|
+
when 403
|
89
|
+
fail ForbiddenError,
|
90
|
+
'You do not have permission to edit the session data'
|
91
|
+
when 500
|
92
|
+
fail InternalServerError, 'Server failed to edit the user'
|
93
|
+
else
|
94
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
95
|
+
'for further details.'
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def verify_get(response)
|
100
|
+
case response.status_code
|
101
|
+
when 200
|
102
|
+
return JSON.parse response.body
|
103
|
+
when 403
|
104
|
+
fail ForbiddenError,
|
105
|
+
'You do not have permission to view the session data'
|
106
|
+
else
|
107
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
108
|
+
'for further details.'
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def verify_password(response)
|
113
|
+
case response.status_code
|
114
|
+
when 200
|
115
|
+
return JSON.parse response.body
|
116
|
+
when 400
|
117
|
+
fail BadRequestError, 'Password is too short'
|
118
|
+
when 401
|
119
|
+
fail UnauthorizedError,
|
120
|
+
'You do not have permission to change this password'
|
121
|
+
when 500
|
122
|
+
fail InternalServerError, 'Server failed to change the password'
|
123
|
+
else
|
124
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
125
|
+
'for further details.'
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def verify_keys(response)
|
130
|
+
case response.status_code
|
131
|
+
when 200
|
132
|
+
return JSON.parse response.body
|
133
|
+
when 401
|
134
|
+
fail UnauthorizedError,
|
135
|
+
'You are not logged in / authenticated'
|
136
|
+
else
|
137
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
138
|
+
'for further details.'
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
@@ -0,0 +1,180 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'Nessus6/errors/bad_request'
|
3
|
+
require 'Nessus6/errors/conflict'
|
4
|
+
require 'Nessus6/errors/forbidden'
|
5
|
+
require 'Nessus6/errors/internal_server_error'
|
6
|
+
require 'Nessus6/errors/not_found'
|
7
|
+
require 'Nessus6/errors/unknown'
|
8
|
+
|
9
|
+
module Nessus6
|
10
|
+
class Users
|
11
|
+
def initialize(client)
|
12
|
+
@client = client
|
13
|
+
end
|
14
|
+
|
15
|
+
def create(credentials, user_perm, user_info = {})
|
16
|
+
new_user = {}.tap do |user|
|
17
|
+
user[:username] = credentials[:username]
|
18
|
+
user[:password] = credentials[:password]
|
19
|
+
user[:permissions] = user_perm[:permissions]
|
20
|
+
user[:type] = user_perm[:type]
|
21
|
+
user[:name] = user_info[:name] if user_info.key?(:name)
|
22
|
+
user[:email] = user_info[:email] if user_info.key?(:email)
|
23
|
+
end
|
24
|
+
|
25
|
+
response = @client.post('users', new_user)
|
26
|
+
|
27
|
+
verify_create response
|
28
|
+
end
|
29
|
+
|
30
|
+
def delete(user_id)
|
31
|
+
response = @client.delete("users/#{user_id}")
|
32
|
+
verify_delete response
|
33
|
+
end
|
34
|
+
|
35
|
+
def edit(user_id, permissions, user_info = {})
|
36
|
+
edit_user = {}.tap do |user|
|
37
|
+
user[:permissions] = permissions
|
38
|
+
user[:name] = user_info[:name] if user_info.key?(:name)
|
39
|
+
user[:email] = user_info[:email] if user_info.key?(:email)
|
40
|
+
end
|
41
|
+
response = @client.post("users/#{user_id}", edit_user)
|
42
|
+
verify_edit response
|
43
|
+
end
|
44
|
+
|
45
|
+
def get(user_id)
|
46
|
+
response = @client.get("users/#{user_id}")
|
47
|
+
verify_get response
|
48
|
+
end
|
49
|
+
|
50
|
+
def list
|
51
|
+
response = @client.get('users')
|
52
|
+
verify_list response
|
53
|
+
end
|
54
|
+
|
55
|
+
def password(user_id, new_password)
|
56
|
+
response = @client.post("users/#{user_id}/chpasswd",
|
57
|
+
password: new_password)
|
58
|
+
verify_password response
|
59
|
+
end
|
60
|
+
|
61
|
+
def keys(user_id)
|
62
|
+
response = @client.get("users/#{user_id}/keys")
|
63
|
+
verify_keys response
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def verify_create(response)
|
69
|
+
case response.status_code
|
70
|
+
when 200
|
71
|
+
return JSON.parse response.body
|
72
|
+
when 400
|
73
|
+
fail BadRequestError, 'Field is invalid'
|
74
|
+
when 403
|
75
|
+
fail ForbiddenError, 'You do not have permission to create this user'
|
76
|
+
when 409
|
77
|
+
fail ConflictError, 'User already exists'
|
78
|
+
else
|
79
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
80
|
+
'for further details.'
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def verify_delete(response)
|
85
|
+
case response.status_code
|
86
|
+
when 200
|
87
|
+
return true
|
88
|
+
when 403
|
89
|
+
fail ForbiddenError, 'Not authorized to delete users'
|
90
|
+
when 404
|
91
|
+
fail NotFoundError, 'You do not have permission to delete this user'
|
92
|
+
when 409
|
93
|
+
fail ConflictError, 'Cannot delete your own account'
|
94
|
+
when 500
|
95
|
+
fail InternalServerError,
|
96
|
+
'Failed to delete the user due to an interal server error'
|
97
|
+
else
|
98
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
99
|
+
'for further details.'
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def verify_edit(response)
|
104
|
+
case response.status_code
|
105
|
+
when 200
|
106
|
+
return JSON.parse response.body
|
107
|
+
when 400
|
108
|
+
fail BadRequestError, 'Field is invalid'
|
109
|
+
when 403
|
110
|
+
fail ForbiddenError, 'You do not have permission to edit this user'
|
111
|
+
when 404
|
112
|
+
fail NotFoundError, 'User does not exist'
|
113
|
+
when 409
|
114
|
+
fail ConflictError, 'Cannot edit your own permissions'
|
115
|
+
else
|
116
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
117
|
+
'for further details.'
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def verify_get(response)
|
122
|
+
case response.status_code
|
123
|
+
when 200
|
124
|
+
return JSON.parse response.body
|
125
|
+
when 404
|
126
|
+
fail NotFoundError, 'User does not exist'
|
127
|
+
else
|
128
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
129
|
+
'for further details.'
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def verify_list(response)
|
134
|
+
case response.status_code
|
135
|
+
when 200
|
136
|
+
return JSON.parse response.body
|
137
|
+
when 403
|
138
|
+
fail ForbiddenError, 'You do not have permission to view the list'
|
139
|
+
else
|
140
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
141
|
+
'for further details.'
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def verify_password(response)
|
146
|
+
case response.status_code
|
147
|
+
when 200
|
148
|
+
return true
|
149
|
+
when 400
|
150
|
+
fail BadRequestError, 'Password is too short'
|
151
|
+
when 403
|
152
|
+
fail ForbiddenError,
|
153
|
+
'You do not have permission to change the users password'
|
154
|
+
when 404
|
155
|
+
fail NotFoundError, 'User does not exist'
|
156
|
+
when 500
|
157
|
+
fail InternalServerError, 'Server failed to change the password'
|
158
|
+
else
|
159
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
160
|
+
'for further details.'
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def verify_keys(response)
|
165
|
+
case response.status_code
|
166
|
+
when 200
|
167
|
+
return JSON.parse response.body
|
168
|
+
when 403
|
169
|
+
fail ForbiddenError, 'You do not have permission to generate API keys'
|
170
|
+
when 404
|
171
|
+
fail NotFoundError, 'User does not exist'
|
172
|
+
when 500
|
173
|
+
fail InternalServerError, 'Server failed to change the keys'
|
174
|
+
else
|
175
|
+
fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
|
176
|
+
'for further details.'
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
metadata
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: Nessus6
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kevin Kirsche
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-08-19 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.9'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.9'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '5.8'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '5.8'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: hurley
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.1'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.1'
|
69
|
+
description: Gem for interacting with the Tenable Nessus 6 REST API.
|
70
|
+
email:
|
71
|
+
- kev.kirsche@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- ".gitignore"
|
77
|
+
- ".travis.yml"
|
78
|
+
- Gemfile
|
79
|
+
- Nessus6.gemspec
|
80
|
+
- README.md
|
81
|
+
- Rakefile
|
82
|
+
- bin/console
|
83
|
+
- bin/setup
|
84
|
+
- lib/Nessus6.rb
|
85
|
+
- lib/Nessus6/editor/methods.rb
|
86
|
+
- lib/Nessus6/errors/bad_request.rb
|
87
|
+
- lib/Nessus6/errors/conflict.rb
|
88
|
+
- lib/Nessus6/errors/forbidden.rb
|
89
|
+
- lib/Nessus6/errors/internal_server_error.rb
|
90
|
+
- lib/Nessus6/errors/not_found.rb
|
91
|
+
- lib/Nessus6/errors/unauthorized.rb
|
92
|
+
- lib/Nessus6/errors/unknown.rb
|
93
|
+
- lib/Nessus6/file/methods.rb
|
94
|
+
- lib/Nessus6/folders/methods.rb
|
95
|
+
- lib/Nessus6/groups/methods.rb
|
96
|
+
- lib/Nessus6/permissions/methods.rb
|
97
|
+
- lib/Nessus6/scans/methods.rb
|
98
|
+
- lib/Nessus6/session/methods.rb
|
99
|
+
- lib/Nessus6/users/methods.rb
|
100
|
+
- lib/Nessus6/version.rb
|
101
|
+
homepage: https://github.com/kkirsche/Nessus6
|
102
|
+
licenses:
|
103
|
+
- Apache-2.0
|
104
|
+
metadata: {}
|
105
|
+
post_install_message:
|
106
|
+
rdoc_options: []
|
107
|
+
require_paths:
|
108
|
+
- lib
|
109
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: 2.0.0
|
114
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
requirements: []
|
120
|
+
rubyforge_project:
|
121
|
+
rubygems_version: 2.4.6
|
122
|
+
signing_key:
|
123
|
+
specification_version: 4
|
124
|
+
summary: "[Under Construction] Nessus 6 API Gem"
|
125
|
+
test_files: []
|