openvas-cli 0.2.6 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/lib/openvas-cli/vas_base.rb +43 -0
- data/lib/openvas-cli/vas_exceptions.rb +2 -0
- data/lib/openvas-cli/vas_lsc_credential.rb +41 -20
- data/lib/openvas-cli/vas_preference.rb +21 -12
- data/lib/openvas-cli/vas_report.rb +43 -26
- data/lib/openvas-cli/vas_result.rb +9 -5
- data/lib/openvas-cli/vas_schedule.rb +25 -17
- data/lib/openvas-cli/vas_target.rb +38 -23
- data/lib/openvas-cli/vas_task.rb +45 -38
- data/openvas-cli.gemspec +2 -2
- data/spec/openvas-cli/vas_lsc_credential_spec.rb +22 -5
- data/spec/openvas-cli/vas_nvt_spec.rb +6 -6
- data/spec/openvas-cli/vas_report_spec.rb +17 -10
- data/spec/openvas-cli/vas_result_spec.rb +35 -5
- data/spec/openvas-cli/vas_schedule_spec.rb +11 -6
- data/spec/openvas-cli/vas_target_spec.rb +6 -7
- data/spec/openvas-cli/vas_task_spec.rb +8 -5
- data/spec/spec_helper.rb +2 -5
- data/vas_test.rb +3 -2
- metadata +4 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.7
|
data/lib/openvas-cli/vas_base.rb
CHANGED
@@ -19,6 +19,12 @@ module OpenvasCli
|
|
19
19
|
|
20
20
|
attr_accessor :id
|
21
21
|
|
22
|
+
def initialize(attributes={})
|
23
|
+
attributes.each { |key, value|
|
24
|
+
instance_variable_set("@#{key}", value)
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
22
28
|
def new_record?
|
23
29
|
@id == nil || @id.empty?
|
24
30
|
end
|
@@ -30,5 +36,42 @@ module OpenvasCli
|
|
30
36
|
def to_param
|
31
37
|
id
|
32
38
|
end
|
39
|
+
|
40
|
+
def to_key
|
41
|
+
if new_record?
|
42
|
+
nil
|
43
|
+
else
|
44
|
+
[@id]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def save!
|
49
|
+
raise(VasExceptions::RecordNotSaved) unless valid?
|
50
|
+
create_or_update || raise(VasExceptions::RecordNotSaved)
|
51
|
+
end
|
52
|
+
|
53
|
+
def save
|
54
|
+
create_or_update if valid?
|
55
|
+
end
|
56
|
+
|
57
|
+
def destroy!
|
58
|
+
delete_record || raise(VasExceptions::RecordNotSaved)
|
59
|
+
end
|
60
|
+
|
61
|
+
def destroy
|
62
|
+
delete_record
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.get_by_id(id)
|
66
|
+
get_all(:id => id).first
|
67
|
+
end
|
68
|
+
|
69
|
+
def create_or_update
|
70
|
+
true
|
71
|
+
end
|
72
|
+
|
73
|
+
def delete_record
|
74
|
+
true
|
75
|
+
end
|
33
76
|
end
|
34
77
|
end
|
@@ -1,6 +1,14 @@
|
|
1
1
|
require 'vas_base'
|
2
2
|
|
3
3
|
module OpenvasCli
|
4
|
+
class VasLscCredentialValidator < ActiveModel::Validator
|
5
|
+
def validate(record)
|
6
|
+
if record.password && record.password != record.password_confirmation
|
7
|
+
record.errors[:password] << "and Password Confirmation do not match."
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
4
12
|
class VasLscCredential < VasBase
|
5
13
|
|
6
14
|
attr_accessor :name
|
@@ -12,17 +20,12 @@ module OpenvasCli
|
|
12
20
|
attr_accessor :package
|
13
21
|
attr_accessor :package_type
|
14
22
|
attr_accessor :password
|
23
|
+
attr_accessor :password_confirmation
|
15
24
|
|
16
25
|
validates :name, :presence => true, :length => {:minimum => 1}
|
17
26
|
validates :login, :presence => true, :length => {:minimum => 1}
|
18
27
|
|
19
|
-
|
20
|
-
@id = params[:id] if params[:id]
|
21
|
-
@name = params[:name] if params[:name]
|
22
|
-
@login = params[:login] if params[:login]
|
23
|
-
@comment = params[:comment] if params[:comment]
|
24
|
-
@password = params[:password] if params[:password]
|
25
|
-
end
|
28
|
+
validates_with VasLscCredentialValidator
|
26
29
|
|
27
30
|
def target_keys
|
28
31
|
@target_keys ||= []
|
@@ -32,9 +35,7 @@ module OpenvasCli
|
|
32
35
|
@targets ||= []
|
33
36
|
end
|
34
37
|
|
35
|
-
def
|
36
|
-
raise "VasLscCredential is not valid" unless valid?
|
37
|
-
|
38
|
+
def create_or_update
|
38
39
|
if @id
|
39
40
|
#update
|
40
41
|
req = Nokogiri::XML::Builder.new { |xml|
|
@@ -57,18 +58,33 @@ module OpenvasCli
|
|
57
58
|
}
|
58
59
|
end
|
59
60
|
|
60
|
-
|
61
|
-
|
62
|
-
|
61
|
+
begin
|
62
|
+
resp = VasLscCredential.connection.send_receive(req.doc)
|
63
|
+
@id = VasLscCredential.extract_value_from("create_lsc_credential_response/@id", resp) unless @id
|
64
|
+
|
65
|
+
true
|
66
|
+
rescue VasExceptions::CommandException => e
|
67
|
+
errors[:command_failure] << e.message
|
68
|
+
|
69
|
+
nil
|
70
|
+
end
|
63
71
|
end
|
64
72
|
|
65
|
-
def
|
73
|
+
def delete_record
|
66
74
|
return unless @id
|
67
75
|
req = Nokogiri::XML::Builder.new { |xml|
|
68
76
|
xml.delete_lsc_credential( :lsc_credential_id => @id )
|
69
77
|
}
|
70
78
|
|
71
|
-
|
79
|
+
begin
|
80
|
+
VasLscCredential.connection.send_receive(req.doc)
|
81
|
+
|
82
|
+
true
|
83
|
+
rescue VasExceptions::CommandException
|
84
|
+
errors[:command_failure] << e.message
|
85
|
+
|
86
|
+
nil
|
87
|
+
end
|
72
88
|
end
|
73
89
|
|
74
90
|
def self.get_all(options={})
|
@@ -78,12 +94,17 @@ module OpenvasCli
|
|
78
94
|
xml.get_lsc_credentials(params)
|
79
95
|
}
|
80
96
|
|
81
|
-
resp = connection.send_receive(req.doc)
|
82
|
-
|
83
97
|
ret = []
|
84
|
-
|
85
|
-
|
86
|
-
|
98
|
+
|
99
|
+
begin
|
100
|
+
resp = connection.send_receive(req.doc)
|
101
|
+
|
102
|
+
resp.xpath("//lsc_credential").each { |cred|
|
103
|
+
ret << from_xml_node(cred)
|
104
|
+
}
|
105
|
+
rescue VasExceptions::CommandException => e
|
106
|
+
|
107
|
+
end
|
87
108
|
|
88
109
|
ret
|
89
110
|
end
|
@@ -39,19 +39,13 @@ module OpenvasCli
|
|
39
39
|
value_will_change! unless val == @value
|
40
40
|
@value = val
|
41
41
|
end
|
42
|
-
|
43
|
-
def initialize(attributes={})
|
44
|
-
@name = attributes[:name] if attributes[:name]
|
45
|
-
@value = attributes[:value] if attributes[:value]
|
46
|
-
@config_id = attributes[:config_id] if attributes[:config_id]
|
47
|
-
end
|
48
|
-
|
42
|
+
|
49
43
|
def config
|
50
|
-
@config ||= VasConfig.
|
44
|
+
@config ||= VasConfig.get_by_id(@config_id)
|
51
45
|
end
|
52
46
|
|
53
47
|
def nvt
|
54
|
-
@nvt ||= VasNVT.
|
48
|
+
@nvt ||= VasNVT.get_by_id(@nvt_id)
|
55
49
|
end
|
56
50
|
|
57
51
|
def val_choices
|
@@ -66,8 +60,11 @@ module OpenvasCli
|
|
66
60
|
end
|
67
61
|
end
|
68
62
|
|
69
|
-
def
|
70
|
-
|
63
|
+
def create_or_update
|
64
|
+
unless @config_id
|
65
|
+
errors[:config_id] << "Config_id required to save"
|
66
|
+
return
|
67
|
+
end
|
71
68
|
req = Nokogiri::XML::Builder.new { |xml|
|
72
69
|
xml.modify_config(:config_id => @config_id) {
|
73
70
|
xml.preference {
|
@@ -84,7 +81,19 @@ module OpenvasCli
|
|
84
81
|
}
|
85
82
|
}
|
86
83
|
|
87
|
-
|
84
|
+
begin
|
85
|
+
VasPreference.connection.send_receive(req.doc)
|
86
|
+
|
87
|
+
true
|
88
|
+
rescue VasExceptions::CommandException => e
|
89
|
+
errors[:command_failure] << e.message
|
90
|
+
|
91
|
+
nil
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def self.get_by_id(id)
|
96
|
+
nil
|
88
97
|
end
|
89
98
|
|
90
99
|
# Pulls Vas preferences.
|
@@ -3,14 +3,12 @@ require 'vas_base'
|
|
3
3
|
module OpenvasCli
|
4
4
|
# Contains the details of a single OpenVAS report.
|
5
5
|
class VasReport < VasBase
|
6
|
-
attr_accessor :report_id
|
7
6
|
attr_accessor :task_id
|
8
7
|
attr_accessor :task_name
|
9
8
|
attr_accessor :started_at
|
10
9
|
# Overall Status Only
|
11
10
|
attr_accessor :status
|
12
11
|
|
13
|
-
validates :report_id, :presence => true, :UUID => true
|
14
12
|
validates :task_id, :presence => true, :UUID => true,
|
15
13
|
:unless => Proc.new { |report| report.empty? }
|
16
14
|
|
@@ -19,9 +17,11 @@ module OpenvasCli
|
|
19
17
|
# === Options:
|
20
18
|
# [:report_id => [report_id]] Pulls a specific +report_id+. If the id provided is bogus, an empty set is returned.
|
21
19
|
# [:filter => [array_of_filter_symbols]] Filters the report results by severity. Valid symbols are: [:high, :medium, :low, :log, :deubg].
|
20
|
+
# [:sort => [sort_field]] Sorts the report by the given field. Possible values are +:task_name+, +:started_at+. defaults to +:started_at+
|
21
|
+
# [:sort_order => [:ascending, :descending]] Order of sort. Defaults to :descending.
|
22
22
|
def self.get_all(options={})
|
23
23
|
params = {}
|
24
|
-
params[:report_id] = options[:
|
24
|
+
params[:report_id] = options[:id] if options[:id]
|
25
25
|
if options[:filter]
|
26
26
|
params[:levels] = ""
|
27
27
|
options[:filter].each { |f|
|
@@ -57,48 +57,65 @@ module OpenvasCli
|
|
57
57
|
|
58
58
|
ret = []
|
59
59
|
repts.xpath('//report').each { |r|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
60
|
+
rep = VasReport.new
|
61
|
+
rep.id = extract_value_from("@id", r)
|
62
|
+
rep.task_id = extract_value_from("task/@id", r)
|
63
|
+
rep.task_name = extract_value_from("task/name", r)
|
64
|
+
rep.status = extract_value_from("scan_run_status", r)
|
65
|
+
rep.started_at = extract_value_from("scan_start", r)
|
66
66
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
67
|
+
rep.result_count[:total] = extract_value_from("result_count/full", r).to_i
|
68
|
+
rep.result_count[:filtered] = extract_value_from("result_count/filtered", r).to_i
|
69
|
+
rep.result_count[:debug][:total] = extract_value_from("result_count/debug/full", r).to_i
|
70
|
+
rep.result_count[:debug][:filtered] = extract_value_from("result_count/debug/filtered", r).to_i
|
71
|
+
rep.result_count[:high][:total] = extract_value_from("result_count/hole/full", r).to_i
|
72
|
+
rep.result_count[:high][:filtered] = extract_value_from("result_count/hold/filtered", r).to_i
|
73
|
+
rep.result_count[:low][:total] = extract_value_from("result_count/info/full", r).to_i
|
74
|
+
rep.result_count[:low][:filtered] = extract_value_from("result_count/info/filtered", r).to_i
|
75
|
+
rep.result_count[:log][:total] = extract_value_from("result_count/log/full", r).to_i
|
76
|
+
rep.result_count[:log][:filtered] = extract_value_from("result_count/log/filtered", r).to_i
|
77
|
+
rep.result_count[:medium][:total] = extract_value_from("result_count/warning/full", r).to_i
|
78
|
+
rep.result_count[:medium][:filtered] = extract_value_from("result_count/warning/filtered", r).to_i
|
79
79
|
|
80
80
|
r.xpath("results/result").each { |result|
|
81
|
-
|
81
|
+
rep.results << VasResult.parse_result_node(result)
|
82
82
|
}
|
83
83
|
|
84
|
-
ret <<
|
84
|
+
ret << rep
|
85
85
|
}
|
86
|
+
|
87
|
+
options[:sort] = :started_at unless options[:sort]
|
88
|
+
options[:sort_order] = :descending unless options[:sort_order]
|
89
|
+
|
90
|
+
if options[:sort] == :started_at
|
91
|
+
if options[:sort_order] == :ascending
|
92
|
+
ret.sort! { |a,b| a.started_at <=> b.started_at }
|
93
|
+
else
|
94
|
+
ret.sort! { |a,b| b.started_at <=> a.started_at }
|
95
|
+
end
|
96
|
+
elsif options[:sort] == :task_name
|
97
|
+
if options[:sort_order] == :ascending
|
98
|
+
ret.sort! { |a,b| a.task_name <=> b.task_name }
|
99
|
+
else
|
100
|
+
ret.sort! { |a,b| b.task_name <=> a.task_name }
|
101
|
+
end
|
102
|
+
end
|
86
103
|
|
87
104
|
ret
|
88
105
|
end
|
89
106
|
|
90
107
|
def to_xml
|
91
108
|
req = Nokogiri::XML::Builder.new { |xml|
|
92
|
-
xml.get_reports(:report_id => @
|
109
|
+
xml.get_reports(:report_id => @id)
|
93
110
|
}
|
94
111
|
|
95
112
|
report = VasReport.connection.send_receive(req.doc)
|
96
113
|
|
97
|
-
report.at_xpath('
|
114
|
+
report.at_xpath('/get_reports_response/report').to_xml
|
98
115
|
end
|
99
116
|
|
100
117
|
def task
|
101
|
-
@task ||= VasTask.
|
118
|
+
@task ||= VasTask.get_by_id(@task_id)
|
102
119
|
end
|
103
120
|
|
104
121
|
def results
|
@@ -6,14 +6,18 @@ module OpenvasCli
|
|
6
6
|
attr_accessor :result_id, :subnet, :host, :port, :rule_id, :threat,
|
7
7
|
:description, :notes, :overrides, :task_id
|
8
8
|
|
9
|
-
validates :
|
10
|
-
|
9
|
+
validates :id, :presence=>true, :UUID=>true
|
10
|
+
|
11
|
+
def self.get_by_id(id)
|
12
|
+
nil
|
13
|
+
end
|
14
|
+
|
11
15
|
def self.get_all(options = {})
|
12
16
|
options[:sort_by] ||= :threat
|
13
17
|
|
14
18
|
params = {:overrides => 0, :notes => 0}
|
15
|
-
if options[:
|
16
|
-
params[:task_id] = options[:
|
19
|
+
if options[:task_id]
|
20
|
+
params[:task_id] = options[:task_id]
|
17
21
|
params[:apply_overrides] = 1 if options[:apply_overrides]
|
18
22
|
end
|
19
23
|
|
@@ -72,7 +76,7 @@ module OpenvasCli
|
|
72
76
|
|
73
77
|
def self.parse_result_node(node, task_id = nil)
|
74
78
|
res = VasResult.new
|
75
|
-
res.
|
79
|
+
res.id = extract_value_from("@id", node)
|
76
80
|
res.threat = extract_value_from("threat", node)
|
77
81
|
res.subnet = extract_value_from("subnet", node)
|
78
82
|
res.host = extract_value_from("host", node)
|
@@ -18,14 +18,6 @@ module OpenvasCli
|
|
18
18
|
|
19
19
|
define_attribute_methods [:name, :comment, :first_time, :period]
|
20
20
|
|
21
|
-
def initialize(params = {})
|
22
|
-
@name = params[:name] if params[:name]
|
23
|
-
@comment = params[:comment] if params[:comment]
|
24
|
-
@first_time = params[:first_time] if params[:first_time]
|
25
|
-
@period = params[:period] if params[:period]
|
26
|
-
reset_changes
|
27
|
-
end
|
28
|
-
|
29
21
|
def changed?
|
30
22
|
local_changes = false
|
31
23
|
local_changes = @period.changed? if @period
|
@@ -53,23 +45,31 @@ module OpenvasCli
|
|
53
45
|
@period = v
|
54
46
|
end
|
55
47
|
|
56
|
-
def
|
48
|
+
def delete_record
|
57
49
|
return unless @id
|
58
50
|
|
59
51
|
req = Nokogiri::XML::Builder.new { |xml|
|
60
52
|
xml.delete_schedule(:schedule_id => @id)
|
61
53
|
}
|
62
54
|
|
63
|
-
|
64
|
-
|
65
|
-
|
55
|
+
begin
|
56
|
+
VasSchedule.connection.send_receive(req.doc)
|
57
|
+
@id = nil
|
58
|
+
reset_changes
|
59
|
+
|
60
|
+
true
|
61
|
+
rescue VasExceptions::CommandException => e
|
62
|
+
errors[:command_failure] << e.message
|
63
|
+
|
64
|
+
nil
|
65
|
+
end
|
66
66
|
end
|
67
67
|
|
68
|
-
def
|
68
|
+
def create_or_update
|
69
69
|
return unless changed? || @id == nil
|
70
70
|
|
71
71
|
if @id
|
72
|
-
destroy
|
72
|
+
return unless destroy
|
73
73
|
end
|
74
74
|
|
75
75
|
req = Nokogiri::XML::Builder.new { |xml|
|
@@ -96,9 +96,17 @@ module OpenvasCli
|
|
96
96
|
}
|
97
97
|
}
|
98
98
|
|
99
|
-
|
100
|
-
|
101
|
-
|
99
|
+
begin
|
100
|
+
resp = VasSchedule.connection.send_receive(req.doc)
|
101
|
+
@id = VasSchedule.extract_value_from("/create_schedule_response/@id", resp) unless @id
|
102
|
+
reset_changes
|
103
|
+
|
104
|
+
true
|
105
|
+
rescue VasExceptions::CommandException => e
|
106
|
+
errors[:command_failure] << e.message
|
107
|
+
|
108
|
+
nil
|
109
|
+
end
|
102
110
|
end
|
103
111
|
|
104
112
|
def self.get_all(options = {})
|
@@ -29,12 +29,13 @@ module OpenvasCli
|
|
29
29
|
|
30
30
|
def changed?
|
31
31
|
local_changes = false
|
32
|
-
|
33
|
-
|
32
|
+
|
33
|
+
local_changes = true unless @org_hosts && @org_hosts.eql?(@hosts)
|
34
|
+
|
34
35
|
unless local_changes == true
|
35
36
|
local_changes = credential_changed?(:ssh) || credential_changed?(:smb)
|
36
37
|
end
|
37
|
-
|
38
|
+
|
38
39
|
local_changes || super
|
39
40
|
end
|
40
41
|
|
@@ -53,15 +54,9 @@ module OpenvasCli
|
|
53
54
|
end
|
54
55
|
|
55
56
|
def initialize(params = {})
|
56
|
-
|
57
|
-
|
58
|
-
@hosts = params[:hosts] if params[:hosts]
|
59
|
-
@comment = params[:comment] if params[:comment]
|
60
|
-
@port_range = params[:port_range] if params[:port_range]
|
61
|
-
|
57
|
+
super(params)
|
58
|
+
|
62
59
|
@org_hosts = @hosts.collect { |h| h } if @hosts
|
63
|
-
|
64
|
-
reset_changes
|
65
60
|
end
|
66
61
|
|
67
62
|
def credentials
|
@@ -86,14 +81,14 @@ module OpenvasCli
|
|
86
81
|
|
87
82
|
def hosts=(val)
|
88
83
|
hosts_will_change! unless @hosts.eql?(val)
|
89
|
-
@
|
84
|
+
@hosts = val
|
90
85
|
|
91
86
|
@org_hosts = val.collect { |h| h } if val
|
92
87
|
end
|
93
88
|
|
94
|
-
def
|
89
|
+
def create_or_update
|
95
90
|
if @id
|
96
|
-
destroy
|
91
|
+
return unless destroy
|
97
92
|
end
|
98
93
|
req = Nokogiri::XML::Builder.new { |xml|
|
99
94
|
xml.create_target {
|
@@ -105,23 +100,38 @@ module OpenvasCli
|
|
105
100
|
xml.port_range { xml.text(@port_range) } if @port_range
|
106
101
|
}
|
107
102
|
}
|
108
|
-
resp = VasTarget.connection.send_receive(req.doc)
|
109
103
|
|
110
|
-
|
104
|
+
begin
|
105
|
+
resp = VasTarget.connection.send_receive(req.doc)
|
106
|
+
@id = VasTarget.extract_value_from("create_target_response/@id", resp)
|
107
|
+
reset_changes
|
108
|
+
|
109
|
+
true
|
110
|
+
rescue VaxExceptions::CommandException => e
|
111
|
+
errors[:command_failure] << e.message
|
112
|
+
|
113
|
+
nil
|
114
|
+
end
|
111
115
|
|
112
|
-
reset_changes
|
113
116
|
end
|
114
117
|
|
115
|
-
def
|
118
|
+
def delete_record
|
116
119
|
return unless @id
|
117
120
|
|
118
121
|
req = Nokogiri::XML::Builder.new { |xml|
|
119
122
|
xml.delete_target(:target_id => @id)
|
120
123
|
}
|
121
124
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
+
begin
|
126
|
+
VasTarget.connection.send_receive(req.doc)
|
127
|
+
@id = nil
|
128
|
+
|
129
|
+
true
|
130
|
+
rescue VaxExceptions::CommandException => e
|
131
|
+
errors[:command_failure] << e.message
|
132
|
+
|
133
|
+
nil
|
134
|
+
end
|
125
135
|
end
|
126
136
|
|
127
137
|
def self.create!(params={})
|
@@ -147,7 +157,9 @@ module OpenvasCli
|
|
147
157
|
targ.id = extract_value_from("@id", t)
|
148
158
|
targ.name = extract_value_from("name", t)
|
149
159
|
host_string = extract_value_from("hosts", t)
|
150
|
-
|
160
|
+
all_hosts = host_string.split(/,/)
|
161
|
+
all_hosts.each { |hst| hst.strip! }
|
162
|
+
targ.hosts = all_hosts
|
151
163
|
targ.comment = extract_value_from("comment", t)
|
152
164
|
targ.port_range = extract_value_from("port_range", t)
|
153
165
|
targ.in_use = extract_value_from("in_use", t).to_i > 0
|
@@ -159,6 +171,8 @@ module OpenvasCli
|
|
159
171
|
targ.task_keys << extract_value_from("@id", task)
|
160
172
|
}
|
161
173
|
|
174
|
+
targ.reset_changes
|
175
|
+
|
162
176
|
ret << targ
|
163
177
|
}
|
164
178
|
|
@@ -184,13 +198,14 @@ module OpenvasCli
|
|
184
198
|
ret = { :ssh => nil, :smb => nil }
|
185
199
|
|
186
200
|
@credential_keys.each { |key, value|
|
187
|
-
ret[key] = VasLscCredential.get_all(:id => value) if value && !value.empty?
|
201
|
+
ret[key] = VasLscCredential.get_all(:id => value)[0] if value && !value.empty?
|
188
202
|
} if @credential_keys
|
189
203
|
|
190
204
|
ret
|
191
205
|
end
|
192
206
|
|
193
207
|
def credential_changed?(key)
|
208
|
+
credential_keys[key] = nil if credential_keys[key] && credential_keys[key].empty?
|
194
209
|
if credential_keys[key] == nil && credentials[key] != nil
|
195
210
|
return true
|
196
211
|
elsif credential_keys[key] != nil && credentials[key] == nil
|
data/lib/openvas-cli/vas_task.rb
CHANGED
@@ -19,16 +19,6 @@ module OpenvasCli
|
|
19
19
|
|
20
20
|
|
21
21
|
define_attribute_methods [:name, :comment, :config_id, :target_id, :schedule_id]
|
22
|
-
|
23
|
-
def initialize(params = {})
|
24
|
-
@name = params[:name] if params[:name]
|
25
|
-
@comment = params[:comment] if params[:comment]
|
26
|
-
@config_id = params[:config_id] if params[:config_id]
|
27
|
-
@target_id = params[:target_id] if params[:target_id]
|
28
|
-
@schedule_id = params[:schedule_id] if params[:schedule_id]
|
29
|
-
@schedule = params[:schedule] if params[:schedule]
|
30
|
-
reset_changes
|
31
|
-
end
|
32
22
|
|
33
23
|
def name=(val)
|
34
24
|
name_will_change! unless @name == val
|
@@ -56,7 +46,7 @@ module OpenvasCli
|
|
56
46
|
end
|
57
47
|
|
58
48
|
def schedule
|
59
|
-
@schedule
|
49
|
+
@schedule ||= pull_my_schedule
|
60
50
|
end
|
61
51
|
|
62
52
|
def schedule=(v)
|
@@ -65,33 +55,32 @@ module OpenvasCli
|
|
65
55
|
end
|
66
56
|
|
67
57
|
def config
|
68
|
-
@config
|
58
|
+
@config ||= pull_my_config
|
69
59
|
end
|
70
60
|
|
71
61
|
def config=(val)
|
72
62
|
@config = val
|
73
|
-
config_id = val
|
63
|
+
config_id = val.id if val
|
74
64
|
end
|
75
65
|
|
76
66
|
def target
|
77
|
-
@target
|
67
|
+
@target ||= pull_my_target
|
78
68
|
end
|
79
69
|
|
80
70
|
def target=(val)
|
81
71
|
@target = val
|
82
|
-
target_id = val
|
72
|
+
target_id = val.id if val
|
83
73
|
end
|
84
74
|
|
85
|
-
def
|
86
|
-
|
87
|
-
|
75
|
+
def create_or_update
|
76
|
+
|
88
77
|
if schedule && schedule.changed?
|
89
|
-
schedule.save
|
78
|
+
return unless schedule.save
|
90
79
|
schedule_id = schedule.id
|
91
80
|
end
|
92
81
|
|
93
82
|
if config.changed?
|
94
|
-
config.save
|
83
|
+
return unless config.save
|
95
84
|
end
|
96
85
|
|
97
86
|
req = Nokogiri::XML::Builder.new { |xml|
|
@@ -112,19 +101,35 @@ module OpenvasCli
|
|
112
101
|
end
|
113
102
|
}
|
114
103
|
|
115
|
-
|
104
|
+
begin
|
105
|
+
resp = VasTask.connection.send_receive(req.doc)
|
106
|
+
@id = VasTask.extract_value_from("/create_task_response/@id", resp) unless @id
|
107
|
+
reset_changes
|
108
|
+
|
109
|
+
true
|
110
|
+
rescue VaxExceptions::CommandException => e
|
111
|
+
errors[:command_failure] << e.message
|
112
|
+
|
113
|
+
nil
|
114
|
+
end
|
116
115
|
|
117
|
-
@id = VasTask.extract_value_from("/create_task_response/@id", resp) unless @id
|
118
116
|
|
119
|
-
reset_changes
|
120
117
|
end
|
121
118
|
|
122
|
-
def
|
119
|
+
def delete_record
|
123
120
|
req = Nokogiri::XML::Builder.new { |xml|
|
124
121
|
xml.delete_task(:task_id => @id)
|
125
122
|
}
|
126
123
|
|
127
|
-
|
124
|
+
begin
|
125
|
+
VasTask.connection.send_receive(req.doc)
|
126
|
+
|
127
|
+
true
|
128
|
+
rescue VaxExceptions::CommandException => e
|
129
|
+
errors[:command_failure] << e.message
|
130
|
+
|
131
|
+
nil
|
132
|
+
end
|
128
133
|
end
|
129
134
|
|
130
135
|
def start
|
@@ -174,10 +179,10 @@ module OpenvasCli
|
|
174
179
|
def self.get_all(options = {})
|
175
180
|
params = {:apply_overrides => 0, :sort_field => "name"}
|
176
181
|
|
177
|
-
params[:task_id] = options[:
|
182
|
+
params[:task_id] = options[:id] if options[:id]
|
178
183
|
|
179
184
|
req = Nokogiri::XML::Builder.new { |xml|
|
180
|
-
xml.get_tasks
|
185
|
+
xml.get_tasks(params)
|
181
186
|
}
|
182
187
|
|
183
188
|
tasks = connection.send_receive(req.doc)
|
@@ -191,20 +196,22 @@ module OpenvasCli
|
|
191
196
|
end
|
192
197
|
|
193
198
|
def self.from_xml_node(node)
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
+
t = VasTask.new
|
200
|
+
t.id = extract_value_from("@id", node)
|
201
|
+
t.name = extract_value_from("name", node)
|
202
|
+
t.comment = extract_value_from("comment", node)
|
203
|
+
t.status = extract_value_from("status", node)
|
199
204
|
if node.at_xpath("progress")
|
200
|
-
|
205
|
+
t.progress = VasTaskProgress.from_xml_node(node.at_xpath("progress"))
|
201
206
|
end
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
207
|
+
t.times_run = extract_value_from("report_count/finished", node).to_i
|
208
|
+
t.last_report_id = extract_value_from("last_report/report/@id", node)
|
209
|
+
t.config_id = extract_value_from("config/@id", node)
|
210
|
+
t.target_id = extract_value_from("target/@id", node)
|
211
|
+
|
212
|
+
t.reset_changes
|
206
213
|
|
207
|
-
|
214
|
+
t
|
208
215
|
end
|
209
216
|
|
210
217
|
private
|
data/openvas-cli.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{openvas-cli}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.7"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Reed Swenson"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-04-04}
|
13
13
|
s.description = %q{A full ruby implementation of the OpenVAS OMP (version 2.0) protocol.}
|
14
14
|
s.email = %q{fleureed@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -19,10 +19,23 @@ module OpenvasCli
|
|
19
19
|
:name => next_test_name,
|
20
20
|
:login => "FOOBAR",
|
21
21
|
:comment => "Yet another test credential",
|
22
|
-
:password => "thisCanTr3@llyBe1"
|
22
|
+
:password => "thisCanTr3@llyBe1",
|
23
|
+
:password_confirmation => "thisCanTr3@llyBe1"
|
23
24
|
}
|
24
25
|
end
|
25
26
|
|
27
|
+
it 'should require password and confirmation to be the same' do
|
28
|
+
cred = VasLscCredential.new(valid_params)
|
29
|
+
cred.should be_valid
|
30
|
+
|
31
|
+
cred.password_confirmation = "something different"
|
32
|
+
cred.should_not be_valid
|
33
|
+
|
34
|
+
cred.should have(1).errors
|
35
|
+
|
36
|
+
cred.errors[:password].should_not be nil
|
37
|
+
end
|
38
|
+
|
26
39
|
it 'should pull all available credentials' do
|
27
40
|
all = VasLscCredential.get_all
|
28
41
|
all.should_not be nil
|
@@ -36,7 +49,7 @@ module OpenvasCli
|
|
36
49
|
cred.id.should_not be nil
|
37
50
|
cred.id.should_not be_empty
|
38
51
|
|
39
|
-
n_cred = VasLscCredential.
|
52
|
+
n_cred = VasLscCredential.get_by_id(cred.id)
|
40
53
|
n_cred.should_not be nil
|
41
54
|
n_cred.id.should == cred.id
|
42
55
|
n_cred.name.should == cred.name
|
@@ -48,13 +61,13 @@ module OpenvasCli
|
|
48
61
|
cred = VasLscCredential.new(valid_params)
|
49
62
|
cred.save!
|
50
63
|
|
51
|
-
n_cred = VasLscCredential.
|
64
|
+
n_cred = VasLscCredential.get_by_id(cred.id)
|
52
65
|
n_cred.login = "NOT_FOOBAR"
|
53
66
|
n_cred.save!
|
54
67
|
|
55
68
|
n_cred.id.should == cred.id
|
56
69
|
|
57
|
-
n_cred = VasLscCredential.
|
70
|
+
n_cred = VasLscCredential.get_by_id(cred.id)
|
58
71
|
n_cred.login.should == "NOT_FOOBAR"
|
59
72
|
end
|
60
73
|
|
@@ -64,9 +77,13 @@ module OpenvasCli
|
|
64
77
|
cred.id.should_not be nil
|
65
78
|
cred.id.should_not be_empty
|
66
79
|
|
67
|
-
n_cred = VasLscCredential.
|
80
|
+
n_cred = VasLscCredential.get_by_id(cred.id)
|
68
81
|
n_cred.should_not be nil
|
69
82
|
n_cred.login.should == 'FOO\\BAR'
|
70
83
|
end
|
84
|
+
|
85
|
+
it 'should not barf if it is given an invalid ID to pull' do
|
86
|
+
lambda {VasLscCredential.get_all(:id => 'foo')}.should_not raise_error
|
87
|
+
end
|
71
88
|
end
|
72
89
|
end
|
@@ -9,14 +9,14 @@ module OpenvasCli
|
|
9
9
|
rules.each{ |r| r.should be_valid }
|
10
10
|
end
|
11
11
|
|
12
|
-
it 'should pull an NVT by OID'
|
13
|
-
|
12
|
+
it 'should pull an NVT by OID' do
|
13
|
+
fam = VasNVTFamily.get_all.choice
|
14
|
+
|
15
|
+
id = VasNVT.get_all(:family => fam.name).choice.id
|
14
16
|
|
15
|
-
rule = VasNVT.
|
17
|
+
rule = VasNVT.get_by_id(id)
|
16
18
|
rule.should_not be nil
|
17
|
-
rule.
|
18
|
-
|
19
|
-
rule[0].should be_valid
|
19
|
+
rule.should be_valid
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'should pull an NVT by Family' do
|
@@ -12,24 +12,22 @@ module OpenvasCli
|
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'should pull a raw XML dump for a single report' do
|
15
|
-
rept = VasReport.get_all
|
15
|
+
rept = VasReport.get_all.choice
|
16
16
|
|
17
17
|
xml = rept.to_xml
|
18
18
|
|
19
19
|
xdoc = Nokogiri::XML(xml) #it should be a valid xml document
|
20
20
|
|
21
|
-
xdoc.at_xpath("//report/@id").value.should == rept.
|
21
|
+
xdoc.at_xpath("//report/@id").value.should == rept.id
|
22
22
|
end
|
23
23
|
|
24
24
|
it 'should pull a specific report by id' do
|
25
|
-
|
26
|
-
|
27
|
-
o_rept = all[rand(all.count)]
|
25
|
+
o_rept = VasReport.get_all.choice
|
28
26
|
o_rept.should_not be nil
|
29
|
-
n_rept = VasReport.
|
27
|
+
n_rept = VasReport.get_by_id(o_rept.id)
|
30
28
|
n_rept.should_not be nil
|
31
29
|
|
32
|
-
o_rept.
|
30
|
+
o_rept.id.should == n_rept.id
|
33
31
|
end
|
34
32
|
|
35
33
|
it 'should report the associated results' do
|
@@ -68,10 +66,19 @@ module OpenvasCli
|
|
68
66
|
|
69
67
|
it 'should return an empty set when passed a bad report_id' do
|
70
68
|
lambda {
|
71
|
-
r = VasReport.
|
72
|
-
r.
|
73
|
-
r.should be_empty
|
69
|
+
r = VasReport.get_by_id(:id => '0000000000')
|
70
|
+
r.should be nil
|
74
71
|
}.should_not raise_error
|
75
72
|
end
|
73
|
+
|
74
|
+
it 'default sort should be by started_at descending' do
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'just adding :sort_order => :ascending should reverse the started_at sort'
|
79
|
+
|
80
|
+
it 'should sort by task_name (default :descending)'
|
81
|
+
|
82
|
+
it 'should sort by :task_name, :ascending'
|
76
83
|
end
|
77
84
|
end
|
@@ -40,8 +40,8 @@ module OpenvasCli
|
|
40
40
|
|
41
41
|
last_id = ""
|
42
42
|
results.each { |r|
|
43
|
-
r.
|
44
|
-
last_id = r.
|
43
|
+
r.id.should >= last_id
|
44
|
+
last_id = r.id
|
45
45
|
}
|
46
46
|
end
|
47
47
|
|
@@ -60,8 +60,8 @@ module OpenvasCli
|
|
60
60
|
|
61
61
|
last_val = ""
|
62
62
|
results.each { |r|
|
63
|
-
r.
|
64
|
-
last_val = r.
|
63
|
+
r.id.should >= last_val
|
64
|
+
last_val = r.id
|
65
65
|
}
|
66
66
|
end
|
67
67
|
|
@@ -89,7 +89,7 @@ module OpenvasCli
|
|
89
89
|
tasks = VasTask.get_all
|
90
90
|
|
91
91
|
unless tasks.empty?
|
92
|
-
task_id = tasks
|
92
|
+
task_id = tasks.choice.id
|
93
93
|
results = VasResult.get_all(:task_id => task_id)
|
94
94
|
results.each { |r| r.task_id.should == task_id }
|
95
95
|
|
@@ -106,5 +106,35 @@ module OpenvasCli
|
|
106
106
|
threats.should include r.threat
|
107
107
|
}
|
108
108
|
end
|
109
|
+
|
110
|
+
it 'should return null when pulling by task_id' do
|
111
|
+
lambda {
|
112
|
+
VasResult.get_by_id('foo').should be nil
|
113
|
+
}.should_not raise_error
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'should not raise an error on save!' do
|
117
|
+
result = VasResult.get_all(:task_id => VasTask.get_all.choice.id).choice
|
118
|
+
lambda {
|
119
|
+
result.save!
|
120
|
+
}.should_not raise_error
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'should return true on save' do
|
124
|
+
result = VasResult.get_all(:task_id => VasTask.get_all.choice.id).choice
|
125
|
+
result.save.should be true
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'should not raise an error on destroy!' do
|
129
|
+
result = VasResult.get_all(:task_id => VasTask.get_all.choice.id).choice
|
130
|
+
lambda {
|
131
|
+
result.destroy!
|
132
|
+
}.should_not raise_error
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'should return true on save' do
|
136
|
+
result = VasResult.get_all(:task_id => VasTask.get_all.choice.id).choice
|
137
|
+
result.destroy.should be true
|
138
|
+
end
|
109
139
|
end
|
110
140
|
end
|
@@ -32,11 +32,16 @@ module OpenvasCli
|
|
32
32
|
|
33
33
|
unless all.empty?
|
34
34
|
schedule_id = all.choice.id
|
35
|
-
|
36
|
-
|
37
|
-
schedules[0].id.should == schedule_id
|
35
|
+
schedule = VasSchedule.get_by_id(schedule_id)
|
36
|
+
schedule.should_not be nil
|
38
37
|
end
|
39
38
|
end
|
39
|
+
|
40
|
+
it 'should return nil if bogus ID is provided' do
|
41
|
+
lambda {
|
42
|
+
VasSchedule.get_by_id("8675309").should be nil
|
43
|
+
}.should_not raise_error
|
44
|
+
end
|
40
45
|
|
41
46
|
it 'default sort should be by name' do
|
42
47
|
all = VasSchedule.get_all
|
@@ -86,7 +91,7 @@ module OpenvasCli
|
|
86
91
|
s.should_not be_changed
|
87
92
|
s.id.should_not be nil
|
88
93
|
|
89
|
-
new_s = VasSchedule.
|
94
|
+
new_s = VasSchedule.get_by_id(s.id)
|
90
95
|
new_s.should_not be nil
|
91
96
|
new_s.id.should == s.id
|
92
97
|
new_s.name.should == s.name
|
@@ -106,9 +111,9 @@ module OpenvasCli
|
|
106
111
|
|
107
112
|
s.id.should_not == old_id
|
108
113
|
|
109
|
-
VasSchedule.
|
114
|
+
VasSchedule.get_by_id(old_id).should be nil
|
110
115
|
|
111
|
-
new_s = VasSchedule.
|
116
|
+
new_s = VasSchedule.get_by_id(s.id)
|
112
117
|
new_s.should_not be nil
|
113
118
|
new_s.id.should == s.id
|
114
119
|
new_s.name.should == s.name
|
@@ -69,14 +69,14 @@ module OpenvasCli
|
|
69
69
|
|
70
70
|
t.id.should_not be nil
|
71
71
|
|
72
|
-
n_t = VasTarget.
|
72
|
+
n_t = VasTarget.get_by_id(t.id)
|
73
73
|
n_t.should_not be nil
|
74
74
|
n_t.id.should == t.id
|
75
75
|
n_t.name.should == t.name
|
76
76
|
n_t.should have(t.hosts.count).hosts
|
77
|
-
|
78
|
-
|
79
|
-
|
77
|
+
n_t.hosts.each { |h|
|
78
|
+
t.hosts.should include h
|
79
|
+
}
|
80
80
|
end
|
81
81
|
|
82
82
|
it 'should record a change when the name has changed' do
|
@@ -133,9 +133,8 @@ module OpenvasCli
|
|
133
133
|
|
134
134
|
t.id.should_not == org_id
|
135
135
|
|
136
|
-
srch = VasTarget.
|
137
|
-
srch.
|
138
|
-
srch.size.should == 0
|
136
|
+
srch = VasTarget.get_by_id(org_id)
|
137
|
+
srch.should be nil
|
139
138
|
end
|
140
139
|
|
141
140
|
it 'should show a change when a new credential is added' do
|
@@ -60,19 +60,22 @@ module OpenvasCli
|
|
60
60
|
|
61
61
|
tasks.should_not be nil
|
62
62
|
|
63
|
-
tasks.each { |t|
|
63
|
+
tasks.each { |t|
|
64
|
+
t.should be_valid
|
65
|
+
}
|
64
66
|
end
|
65
67
|
|
66
68
|
it 'should create a task' do
|
67
69
|
t = VasTask.new(valid_params)
|
68
|
-
t.save
|
70
|
+
t.save.should_not be nil
|
69
71
|
|
70
72
|
t.id.should_not be nil
|
71
73
|
t.id.should_not be_empty
|
72
74
|
|
73
|
-
new_t = VasTask.
|
75
|
+
new_t = VasTask.get_by_id(t.id)
|
74
76
|
new_t.should_not be nil
|
75
77
|
|
78
|
+
new_t.id.should == t.id
|
76
79
|
new_t.name.should == t.name
|
77
80
|
new_t.config_id.should == t.config_id
|
78
81
|
new_t.target_id.should == t.target_id
|
@@ -86,9 +89,9 @@ module OpenvasCli
|
|
86
89
|
if all.length > 0
|
87
90
|
task = all[0]
|
88
91
|
|
89
|
-
new_task = VasTask.
|
92
|
+
new_task = VasTask.get_by_id(task.id)
|
90
93
|
|
91
|
-
task.
|
94
|
+
task.id.should == new_task.id
|
92
95
|
end
|
93
96
|
end
|
94
97
|
|
data/spec/spec_helper.rb
CHANGED
@@ -5,7 +5,7 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
5
5
|
require 'rspec'
|
6
6
|
require 'log4r'
|
7
7
|
require 'fileutils'
|
8
|
-
require '
|
8
|
+
require 'openvas-cli'
|
9
9
|
|
10
10
|
Dir["#{File.dirname(__FILE__)}/../lib/openvas-cli/vas_*.rb"].each {|f| require f}
|
11
11
|
# Requires supporting files with custom matchers and macros, etc,
|
@@ -13,7 +13,7 @@ Dir["#{File.dirname(__FILE__)}/../lib/openvas-cli/vas_*.rb"].each {|f| require f
|
|
13
13
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
14
14
|
|
15
15
|
RSpec.configure do |config|
|
16
|
-
|
16
|
+
config.filter_run_excluding :slow => true
|
17
17
|
end
|
18
18
|
|
19
19
|
|
@@ -29,9 +29,6 @@ log_out = Log4r::RollingFileOutputter.new('test_log' ,
|
|
29
29
|
:maxsize => 10485760})
|
30
30
|
log_out.level = Log4r::INFO
|
31
31
|
logger.outputters = log_out
|
32
|
-
#VasManager.logger = logger
|
33
|
-
#VasManager.user = "admin"
|
34
|
-
#VasManager.password = "Password"
|
35
32
|
|
36
33
|
OpenvasCli.configure { |config|
|
37
34
|
config.password = "Password"
|
data/vas_test.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: openvas-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 7
|
10
|
+
version: 0.2.7
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Reed Swenson
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-04-04 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|