tenable-ruby 0.4.0 → 0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/tenable-ruby.rb +70 -17
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0ffe53830580db35bbb25fa2b418ef6fd4de79d276b65d65689f662270e1ea2e
|
4
|
+
data.tar.gz: 2a47587b3045d58b9b05ba186e288068da080ebd7497e129587ed7d8430011dc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 718a5e61e6005ccb0500248309dc985614a37dd9905d45e8fac03d74281b1c61369500e61bba9f29b1a6391c35c17bc873ba0ef0a7c4927f5586197edf202d59
|
7
|
+
data.tar.gz: 89f12942cec5d12d0fbaa4775affa2805c362242434b229168fffa09c79d5219cfbc2cdb58e38c560abf11a79506809bb107a6b59dd1cf10dbc948ea151e635c
|
data/lib/tenable-ruby.rb
CHANGED
@@ -526,11 +526,11 @@ module TenableRuby
|
|
526
526
|
|
527
527
|
# Performs scan with scan policy provided (uuid of policy or policy name).
|
528
528
|
# Name is your scan name and opts is your scan configuration hash
|
529
|
-
# (
|
529
|
+
# (scan_folder is optional - folder where to save the scan (if that folder exists))
|
530
530
|
# (scanner_id is optional - ID of the scanner/cloud scanner you want to run this scan on)
|
531
531
|
#
|
532
532
|
# returns: JSON parsed object with scan info
|
533
|
-
def scan_quick_policy(policyname, name, opts = {},
|
533
|
+
def scan_quick_policy(policyname, name, opts = {}, scan_folder = nil, scanner_id = nil)
|
534
534
|
policies = list_policies['policies']
|
535
535
|
if policies.nil?
|
536
536
|
raise TenableRuby::Error::TenableError, "Tenable API request 'list_policies' responded with 'nil'"
|
@@ -548,16 +548,18 @@ module TenableRuby
|
|
548
548
|
settings.merge!(opts)
|
549
549
|
settings['name'] = name
|
550
550
|
settings['policy_id'] = policy['id']
|
551
|
-
|
551
|
+
if scan_folder.is_a?(Integer)
|
552
|
+
settings['folder_id'] = scan_folder
|
553
|
+
elsif scan_folder.is_a?(String)
|
552
554
|
folders = list_folders['folders']
|
553
555
|
if folders.nil?
|
554
556
|
raise TenableRuby::Error::TenableError, "Tenable API request 'list_folders' responded with 'nil'"
|
555
557
|
end
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
558
|
+
selected_folder = folders.find { |f| f['name'] == scan_folder }
|
559
|
+
if selected_folder
|
560
|
+
settings['folder_id'] = selected_folder['id']
|
561
|
+
else
|
562
|
+
raise TenableRuby::Error::TenableError, "Could not find folder with name #{scan_folder}"
|
561
563
|
end
|
562
564
|
end
|
563
565
|
unless scanner_id.nil?
|
@@ -570,7 +572,12 @@ module TenableRuby
|
|
570
572
|
#
|
571
573
|
# Reference: https://developer.tenable.com/reference#scans-get-latest-status
|
572
574
|
def scan_status(scan_id)
|
573
|
-
http_get(:uri => "/scans/#{scan_id}/latest-status", :fields => header)
|
575
|
+
response = http_get(:uri => "/scans/#{scan_id}/latest-status", :fields => header)
|
576
|
+
if response.is_a?(Hash) and response.has_key?('status')
|
577
|
+
response['status']
|
578
|
+
else
|
579
|
+
raise TenableRuby::Error::TenableError, "Tenable.io did not return a valid status response"
|
580
|
+
end
|
574
581
|
end
|
575
582
|
|
576
583
|
# Parse the scan status command to determine if a scan has finished
|
@@ -692,6 +699,48 @@ module TenableRuby
|
|
692
699
|
http_get(:uri => "/container-security/api/v1/reports/by_image_digest?image_digest=#{image_digest}", :fields => header)
|
693
700
|
end
|
694
701
|
|
702
|
+
# Creates a new target group for the current user.
|
703
|
+
#
|
704
|
+
# Reference:
|
705
|
+
# https://developer.tenable.com/reference#target-groups-create
|
706
|
+
def create_target_group(name, members, acls: nil)
|
707
|
+
http_post(:uri => "/target-groups", :fields => header,
|
708
|
+
:data => {:name => name, :members => members, :acls => acls})
|
709
|
+
end
|
710
|
+
|
711
|
+
# Returns the current target groups.
|
712
|
+
#
|
713
|
+
# Reference:
|
714
|
+
# https://developer.tenable.com/reference#target-groups-list
|
715
|
+
def list_target_groups
|
716
|
+
http_get(:uri => "/target-groups", :fields => header)
|
717
|
+
end
|
718
|
+
|
719
|
+
# Returns details for the specified target group.
|
720
|
+
#
|
721
|
+
# Reference:
|
722
|
+
# https://developer.tenable.com/reference#target-groups-details
|
723
|
+
def get_target_group(group_id)
|
724
|
+
http_get(:uri => "/target-groups/#{group_id}", :fields => header)
|
725
|
+
end
|
726
|
+
|
727
|
+
# Updates a target group.
|
728
|
+
#
|
729
|
+
# Reference:
|
730
|
+
# https://developer.tenable.com/reference#target-groups-edit
|
731
|
+
def update_target_group(group_id, name, members, acls: nil)
|
732
|
+
http_put(:uri => "/target-groups/#{group_id}", :fields => header,
|
733
|
+
:data => {:name => name, :members => members, :acls => acls})
|
734
|
+
end
|
735
|
+
|
736
|
+
# Deletes a target group.
|
737
|
+
#
|
738
|
+
# Reference:
|
739
|
+
# https://developer.tenable.com/reference#target-groups-delete
|
740
|
+
def delete_target_group(group_id)
|
741
|
+
http_delete(:uri => "/target-groups/#{group_id}", :fields => header)
|
742
|
+
end
|
743
|
+
|
695
744
|
private
|
696
745
|
|
697
746
|
# Perform HTTP put method with uri, data and fields
|
@@ -799,7 +848,6 @@ module TenableRuby
|
|
799
848
|
uri = opts[:uri]
|
800
849
|
fields = opts[:fields] || {}
|
801
850
|
raw_content = opts[:raw_content] || false
|
802
|
-
json = {}
|
803
851
|
tries = @httpretry
|
804
852
|
|
805
853
|
request = Net::HTTP::Get.new(uri)
|
@@ -815,11 +863,17 @@ module TenableRuby
|
|
815
863
|
sleep @httpsleep
|
816
864
|
retry
|
817
865
|
else
|
818
|
-
|
866
|
+
raise TenableRuby::Error::TenableError.new("#{e}: No more retries for http GET '#{opts[:uri]}'")
|
819
867
|
end
|
820
|
-
rescue URI::InvalidURIError
|
821
|
-
|
868
|
+
rescue URI::InvalidURIError => e
|
869
|
+
raise TenableRuby::Error::TenableError.new("#{e}: http GET '#{opts[:uri]}'")
|
870
|
+
end
|
871
|
+
|
872
|
+
if response.code.to_s != "200"
|
873
|
+
raise TenableRuby::Error::TenableError.new(response: response),
|
874
|
+
"Tenable API request '#{opts[:uri]}' responded with response code #{response.code}"
|
822
875
|
end
|
876
|
+
|
823
877
|
if !raw_content
|
824
878
|
parse_json(response.body)
|
825
879
|
else
|
@@ -854,7 +908,6 @@ module TenableRuby
|
|
854
908
|
fields = opts[:fields] || {}
|
855
909
|
body = opts[:body]
|
856
910
|
ctype = opts[:ctype]
|
857
|
-
json = {}
|
858
911
|
tries = @httpretry
|
859
912
|
|
860
913
|
request = Net::HTTP::Post.new(uri)
|
@@ -873,10 +926,10 @@ module TenableRuby
|
|
873
926
|
sleep @httpsleep
|
874
927
|
retry
|
875
928
|
else
|
876
|
-
|
929
|
+
raise TenableRuby::Error::TenableError.new("#{e}: No more retries for http POST '#{opts[:uri]}'")
|
877
930
|
end
|
878
|
-
rescue URI::InvalidURIError
|
879
|
-
|
931
|
+
rescue URI::InvalidURIError => e
|
932
|
+
raise TenableRuby::Error::TenableError.new("#{e}: http POST '#{opts[:uri]}'")
|
880
933
|
end
|
881
934
|
|
882
935
|
if response.code.to_s != "200"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tenable-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.5'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Patrick Craston
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-07-01 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |-
|
14
14
|
Ruby library for communicating with the tenable.io API.
|
@@ -25,7 +25,7 @@ homepage: https://gitlab.com/intruder/tenable-ruby
|
|
25
25
|
licenses:
|
26
26
|
- MIT
|
27
27
|
metadata: {}
|
28
|
-
post_install_message:
|
28
|
+
post_install_message:
|
29
29
|
rdoc_options: []
|
30
30
|
require_paths:
|
31
31
|
- lib
|
@@ -41,7 +41,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
41
41
|
version: '0'
|
42
42
|
requirements: []
|
43
43
|
rubygems_version: 3.0.3
|
44
|
-
signing_key:
|
44
|
+
signing_key:
|
45
45
|
specification_version: 4
|
46
46
|
summary: Ruby library for communicating with the tenable.io API
|
47
47
|
test_files: []
|