openvas-cli 0.1.1 → 0.2.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.
- data/Gemfile +2 -0
- data/Gemfile.lock +50 -0
- data/VERSION +1 -1
- data/lib/openvas-cli/configuration.rb +25 -0
- data/lib/openvas-cli/conn_addin.rb +27 -0
- data/lib/openvas-cli/immutable_children_validator.rb +15 -0
- data/lib/openvas-cli/vas_administrator.rb +7 -0
- data/lib/openvas-cli/vas_base.rb +20 -30
- data/lib/openvas-cli/vas_config.rb +127 -0
- data/lib/openvas-cli/vas_connection.rb +140 -0
- data/lib/openvas-cli/vas_exceptions.rb +9 -7
- data/lib/openvas-cli/vas_lsc_credential.rb +110 -0
- data/lib/openvas-cli/vas_nvt.rb +64 -64
- data/lib/openvas-cli/vas_nvt_family.rb +39 -30
- data/lib/openvas-cli/vas_override.rb +6 -4
- data/lib/openvas-cli/vas_period.rb +89 -0
- data/lib/openvas-cli/vas_preference.rb +139 -49
- data/lib/openvas-cli/vas_report.rb +110 -103
- data/lib/openvas-cli/vas_result.rb +90 -89
- data/lib/openvas-cli/vas_schedule.rb +163 -55
- data/lib/openvas-cli/vas_target.rb +200 -23
- data/lib/openvas-cli/vas_task.rb +229 -30
- data/lib/openvas-cli/vas_task_progress.rb +29 -0
- data/lib/openvas-cli/xml_addin.rb +34 -0
- data/lib/openvas_cli.rb +19 -0
- data/openvas-cli.gemspec +28 -6
- data/spec/openvas-cli/vas_administrator_spec.rb +6 -0
- data/spec/openvas-cli/vas_config_spec.rb +81 -0
- data/spec/openvas-cli/vas_lsc_credential_spec.rb +72 -0
- data/spec/openvas-cli/vas_nvt_family_spec.rb +7 -5
- data/spec/openvas-cli/vas_nvt_spec.rb +30 -26
- data/spec/openvas-cli/vas_period_spec.rb +7 -0
- data/spec/openvas-cli/vas_preference_spec.rb +23 -21
- data/spec/openvas-cli/vas_report_spec.rb +65 -63
- data/spec/openvas-cli/vas_result_spec.rb +94 -93
- data/spec/openvas-cli/vas_schedule_spec.rb +154 -57
- data/spec/openvas-cli/vas_target_spec.rb +140 -28
- data/spec/openvas-cli/vas_task_spec.rb +92 -11
- data/spec/spec_helper.rb +15 -5
- metadata +72 -24
- data/lib/openvas-cli/openvas-cli.rb +0 -273
- data/spec/openvas-cli/openvas-cli_spec.rb +0 -45
| @@ -1,8 +1,10 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
             | 
| 3 | 
            -
               | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 1 | 
            +
            module OpenvasCli
         | 
| 2 | 
            +
              # Continer for all cusom exceptions used in openvas-cli.
         | 
| 3 | 
            +
              module VasExceptions
         | 
| 4 | 
            +
                # Thrown when the OpenVAS management service rejects a command for some reason.
         | 
| 5 | 
            +
                class CommandException < StandardError; end
         | 
| 6 | 
            +
                # Thrown when some sort of communications error (like a timeout or unexpected
         | 
| 7 | 
            +
                # end-of-file) is encountered.
         | 
| 8 | 
            +
                class CommunicationException < StandardError; end
         | 
| 9 | 
            +
              end
         | 
| 8 10 | 
             
            end
         | 
| @@ -0,0 +1,110 @@ | |
| 1 | 
            +
            require 'vas_base'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module OpenvasCli
         | 
| 4 | 
            +
              class VasLscCredential < VasBase
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                attr_accessor :name
         | 
| 7 | 
            +
                attr_accessor :login
         | 
| 8 | 
            +
                attr_accessor :comment
         | 
| 9 | 
            +
                attr_accessor :in_use
         | 
| 10 | 
            +
                attr_accessor :type
         | 
| 11 | 
            +
                attr_accessor :public_key
         | 
| 12 | 
            +
                attr_accessor :package
         | 
| 13 | 
            +
                attr_accessor :package_type
         | 
| 14 | 
            +
                attr_accessor :password 
         | 
| 15 | 
            +
                
         | 
| 16 | 
            +
                validates :name,  :presence => true, :length => {:minimum => 1}
         | 
| 17 | 
            +
                validates :login, :presence => true, :length => {:minimum => 1} 
         | 
| 18 | 
            +
                
         | 
| 19 | 
            +
                def initialize(params = {})
         | 
| 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
         | 
| 26 | 
            +
                
         | 
| 27 | 
            +
                def target_keys
         | 
| 28 | 
            +
                  @target_keys ||= []
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
                
         | 
| 31 | 
            +
                def targets
         | 
| 32 | 
            +
                  @targets ||= []
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
                
         | 
| 35 | 
            +
                def save!
         | 
| 36 | 
            +
                  raise "VasLscCredential is not valid" unless valid?
         | 
| 37 | 
            +
                  
         | 
| 38 | 
            +
                  if @id
         | 
| 39 | 
            +
                    #update
         | 
| 40 | 
            +
                    req = Nokogiri::XML::Builder.new { |xml|
         | 
| 41 | 
            +
                      xml.modify_lsc_credential(:lsc_credential_id => @id) {
         | 
| 42 | 
            +
                        xml.name     { xml.text(@name) }
         | 
| 43 | 
            +
                        xml.comment  { xml.text(@comment) } if @comment
         | 
| 44 | 
            +
                        xml.login    { xml.text(@login) }
         | 
| 45 | 
            +
                        xml.password { xml.text(@password) } if @password
         | 
| 46 | 
            +
                      } 
         | 
| 47 | 
            +
                    }
         | 
| 48 | 
            +
                  else
         | 
| 49 | 
            +
                    #create
         | 
| 50 | 
            +
                    req = Nokogiri::XML::Builder.new { |xml|
         | 
| 51 | 
            +
                      xml.create_lsc_credential {
         | 
| 52 | 
            +
                        xml.name     { xml.text(@name) }
         | 
| 53 | 
            +
                        xml.comment  { xml.text(@comment) } if @comment
         | 
| 54 | 
            +
                        xml.login    { xml.text(@login) }
         | 
| 55 | 
            +
                        xml.password { xml.text(@password) } if @password
         | 
| 56 | 
            +
                      }
         | 
| 57 | 
            +
                    }
         | 
| 58 | 
            +
                  end
         | 
| 59 | 
            +
                  
         | 
| 60 | 
            +
                  resp = VasLscCredential.connection.send_receive(req.doc)
         | 
| 61 | 
            +
                  
         | 
| 62 | 
            +
                  @id = VasLscCredential.extract_value_from("create_lsc_credential_response/@id", resp) unless @id
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
                
         | 
| 65 | 
            +
                def destroy!
         | 
| 66 | 
            +
                  return unless @id
         | 
| 67 | 
            +
                  req = Nokogiri::XML::Builder.new { |xml|
         | 
| 68 | 
            +
                    xml.delete_lsc_credential( :lsc_credential_id => @id )
         | 
| 69 | 
            +
                  }
         | 
| 70 | 
            +
                  
         | 
| 71 | 
            +
                  VasLscCredential.connection.send_receive(req.doc)
         | 
| 72 | 
            +
                end
         | 
| 73 | 
            +
                
         | 
| 74 | 
            +
                def self.get_all(options={})
         | 
| 75 | 
            +
                  params = {:sort_field => 'name'}
         | 
| 76 | 
            +
                  params[:lsc_credential_id] = options[:id] if options[:id]
         | 
| 77 | 
            +
                  req = Nokogiri::XML::Builder.new { |xml|
         | 
| 78 | 
            +
                    xml.get_lsc_credentials(params)
         | 
| 79 | 
            +
                  }
         | 
| 80 | 
            +
                  
         | 
| 81 | 
            +
                  resp = connection.send_receive(req.doc)
         | 
| 82 | 
            +
                  
         | 
| 83 | 
            +
                  ret = []
         | 
| 84 | 
            +
                  resp.xpath("//lsc_credential").each { |cred|
         | 
| 85 | 
            +
                    ret << from_xml_node(cred)
         | 
| 86 | 
            +
                  }
         | 
| 87 | 
            +
                  
         | 
| 88 | 
            +
                  ret
         | 
| 89 | 
            +
                end
         | 
| 90 | 
            +
                
         | 
| 91 | 
            +
                def self.from_xml_node(node)
         | 
| 92 | 
            +
                  ret              = VasLscCredential.new
         | 
| 93 | 
            +
                  ret.id           = extract_value_from("@id", node)
         | 
| 94 | 
            +
                  ret.name         = extract_value_from("name", node)
         | 
| 95 | 
            +
                  ret.login        = extract_value_from("login", node)
         | 
| 96 | 
            +
                  ret.comment      = extract_value_from("comment", node)
         | 
| 97 | 
            +
                  ret.in_use       = extract_value_from("in_use", node).to_i > 0
         | 
| 98 | 
            +
                  ret.type         = extract_value_from("type", node)
         | 
| 99 | 
            +
                  ret.public_key   = extract_value_from("public_key", node)
         | 
| 100 | 
            +
                  ret.package      = extract_value_from("package", node)
         | 
| 101 | 
            +
                  ret.package_type = extract_value_from("package/@format", node)
         | 
| 102 | 
            +
                  
         | 
| 103 | 
            +
                  node.xpath("targets/target").each { |t|
         | 
| 104 | 
            +
                    ret.target_keys << extract_value_from("@id", t)
         | 
| 105 | 
            +
                  }
         | 
| 106 | 
            +
                  
         | 
| 107 | 
            +
                  ret
         | 
| 108 | 
            +
                end
         | 
| 109 | 
            +
              end
         | 
| 110 | 
            +
            end
         | 
    
        data/lib/openvas-cli/vas_nvt.rb
    CHANGED
    
    | @@ -1,70 +1,70 @@ | |
| 1 1 | 
             
            require 'vas_base'
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
            # TODO:  | 
| 7 | 
            -
            # TODO:  | 
| 8 | 
            -
            # TODO:  | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
               | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
              attr_accessor :name
         | 
| 15 | 
            -
              
         | 
| 16 | 
            -
              attr_accessor :category
         | 
| 17 | 
            -
              attr_accessor :copyright
         | 
| 18 | 
            -
              attr_accessor :description
         | 
| 19 | 
            -
              attr_accessor :summary 
         | 
| 20 | 
            -
              attr_accessor :family
         | 
| 21 | 
            -
              attr_accessor :version
         | 
| 22 | 
            -
              attr_accessor :cvss_base
         | 
| 23 | 
            -
              attr_accessor :risk_factor
         | 
| 24 | 
            -
              attr_accessor :cve_id
         | 
| 25 | 
            -
              attr_accessor :bugtraq_id
         | 
| 26 | 
            -
              attr_accessor :xrefs
         | 
| 27 | 
            -
              attr_accessor :tags
         | 
| 28 | 
            -
              attr_accessor :preferences
         | 
| 29 | 
            -
                            
         | 
| 30 | 
            -
              validates :oid, :presence => true, :OID => true
         | 
| 31 | 
            -
              
         | 
| 32 | 
            -
              # Pulls VasNVT rules that match the provided options.
         | 
| 33 | 
            -
              #
         | 
| 34 | 
            -
              # === Options:
         | 
| 35 | 
            -
              # [:nvt_oid => [VasNVT.oid]] will pull only the NVT rule that matches the given OID
         | 
| 36 | 
            -
              # [:family => [VasFamily.name]] will pull all NVT rules for the specified family
         | 
| 37 | 
            -
              def self.get_all(options = {})
         | 
| 38 | 
            -
                params = {:details => '1'}
         | 
| 39 | 
            -
                params[:nvt_oid] = options[:oid] if options[:oid]
         | 
| 40 | 
            -
                params[:family]  = options[:family] if options[:family]
         | 
| 41 | 
            -
              
         | 
| 42 | 
            -
                req = Nokogiri::XML::Builder.new { |xml|
         | 
| 43 | 
            -
                  xml.get_nvts(params)
         | 
| 44 | 
            -
                }
         | 
| 3 | 
            +
            module OpenvasCli
         | 
| 4 | 
            +
              # Describes a NSIS/OpenVAS scan rule.
         | 
| 5 | 
            +
              #--
         | 
| 6 | 
            +
              # TODO: Filter by other useful fields
         | 
| 7 | 
            +
              # TODO: Find external links for more information
         | 
| 8 | 
            +
              # TODO: Redcloth and Autolink description
         | 
| 9 | 
            +
              # TODO: Implement sorting options[:sort_by]
         | 
| 10 | 
            +
              #++
         | 
| 11 | 
            +
              class VasNVT < VasBase
         | 
| 12 | 
            +
                # Human readable name of the rule.
         | 
| 13 | 
            +
                attr_accessor :name
         | 
| 45 14 |  | 
| 46 | 
            -
                 | 
| 15 | 
            +
                attr_accessor :category
         | 
| 16 | 
            +
                attr_accessor :copyright
         | 
| 17 | 
            +
                attr_accessor :description
         | 
| 18 | 
            +
                attr_accessor :summary 
         | 
| 19 | 
            +
                attr_accessor :family
         | 
| 20 | 
            +
                attr_accessor :version
         | 
| 21 | 
            +
                attr_accessor :cvss_base
         | 
| 22 | 
            +
                attr_accessor :risk_factor
         | 
| 23 | 
            +
                attr_accessor :cve_id
         | 
| 24 | 
            +
                attr_accessor :bugtraq_id
         | 
| 25 | 
            +
                attr_accessor :xrefs
         | 
| 26 | 
            +
                attr_accessor :tags
         | 
| 27 | 
            +
                attr_accessor :preferences
         | 
| 47 28 |  | 
| 48 | 
            -
                 | 
| 49 | 
            -
                rules | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
                   | 
| 56 | 
            -
                   | 
| 57 | 
            -
                   | 
| 58 | 
            -
                   | 
| 59 | 
            -
                  rule.cvss_base   = extract_value_from("cvss_base", nvt)
         | 
| 60 | 
            -
                  rule.risk_factor = extract_value_from("risk_factor", nvt)
         | 
| 61 | 
            -
                  rule.cve_id      = extract_value_from("cve_id", nvt)
         | 
| 62 | 
            -
                  rule.bugtraq_id  = extract_value_from("bugtraq_id", nvt)
         | 
| 63 | 
            -
                  rule.xrefs       = extract_value_from("xrefs", nvt).split(/, ?/)
         | 
| 64 | 
            -
                  rule.tags        = extract_value_from("tags", nvt).split(/, ?/)
         | 
| 65 | 
            -
                  ret << rule
         | 
| 66 | 
            -
                }
         | 
| 29 | 
            +
                validates :id, :OID => true, :presence => true
         | 
| 30 | 
            +
                # Pulls VasNVT rules that match the provided options.
         | 
| 31 | 
            +
                #
         | 
| 32 | 
            +
                # === Options:
         | 
| 33 | 
            +
                # [:id => [VasNVT.oid]] will pull only the NVT rule that matches the given OID
         | 
| 34 | 
            +
                # [:family => [VasFamily.name]] will pull all NVT rules for the specified family
         | 
| 35 | 
            +
                def self.get_all(options = {})
         | 
| 36 | 
            +
                  params = {:details => '1'}
         | 
| 37 | 
            +
                  params[:nvt_oid] = options[:id] if options[:id]
         | 
| 38 | 
            +
                  params[:family]  = options[:family] if options[:family]
         | 
| 39 | 
            +
                  params[:config_id] = options[:config_id] if options[:config_id]
         | 
| 67 40 |  | 
| 68 | 
            -
             | 
| 69 | 
            -
             | 
| 41 | 
            +
                  req = Nokogiri::XML::Builder.new { |xml|
         | 
| 42 | 
            +
                    xml.get_nvts(params)
         | 
| 43 | 
            +
                  }
         | 
| 44 | 
            +
                  
         | 
| 45 | 
            +
                  rules = connection.send_receive(req.doc)
         | 
| 46 | 
            +
                  
         | 
| 47 | 
            +
                  ret = []
         | 
| 48 | 
            +
                  rules.xpath("/get_nvts_response/nvt").each { |nvt|
         | 
| 49 | 
            +
                    rule             = VasNVT.new
         | 
| 50 | 
            +
                    rule.id          = extract_value_from("@oid", nvt)
         | 
| 51 | 
            +
                    rule.name        = extract_value_from("name", nvt)
         | 
| 52 | 
            +
                    rule.category    = extract_value_from("category", nvt)
         | 
| 53 | 
            +
                    rule.copyright   = extract_value_from("copyright", nvt)
         | 
| 54 | 
            +
                    rule.description = extract_value_from("description", nvt).strip
         | 
| 55 | 
            +
                    rule.summary     = extract_value_from("summary", nvt)
         | 
| 56 | 
            +
                    rule.family      = extract_value_from("family", nvt)
         | 
| 57 | 
            +
                    rule.version     = extract_value_from("version", nvt)
         | 
| 58 | 
            +
                    rule.cvss_base   = extract_value_from("cvss_base", nvt)
         | 
| 59 | 
            +
                    rule.risk_factor = extract_value_from("risk_factor", nvt)
         | 
| 60 | 
            +
                    rule.cve_id      = extract_value_from("cve_id", nvt)
         | 
| 61 | 
            +
                    rule.bugtraq_id  = extract_value_from("bugtraq_id", nvt)
         | 
| 62 | 
            +
                    rule.xrefs       = extract_value_from("xrefs", nvt).split(/, ?/)
         | 
| 63 | 
            +
                    rule.tags        = extract_value_from("tags", nvt).split(/, ?/)
         | 
| 64 | 
            +
                    ret << rule
         | 
| 65 | 
            +
                  }
         | 
| 66 | 
            +
                  
         | 
| 67 | 
            +
                  ret
         | 
| 68 | 
            +
                end  
         | 
| 69 | 
            +
              end
         | 
| 70 70 | 
             
            end
         | 
| @@ -1,37 +1,46 @@ | |
| 1 1 | 
             
            require 'vas_base'
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
               | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
              
         | 
| 12 | 
            -
              # Pulls all NVT Families defined on the server.
         | 
| 13 | 
            -
              #
         | 
| 14 | 
            -
              # === Options:
         | 
| 15 | 
            -
              # None.
         | 
| 16 | 
            -
              #--
         | 
| 17 | 
            -
              # TODO: Implement options[:sort_by]
         | 
| 18 | 
            -
              #++
         | 
| 19 | 
            -
              def self.get_all(options = {})
         | 
| 20 | 
            -
              
         | 
| 21 | 
            -
                req = Nokogiri::XML::Builder.new { |xml|
         | 
| 22 | 
            -
                  xml.get_nvt_families
         | 
| 23 | 
            -
                }
         | 
| 3 | 
            +
            module OpenvasCli
         | 
| 4 | 
            +
              # Category for NVT rules
         | 
| 5 | 
            +
              class VasNVTFamily < VasBase
         | 
| 6 | 
            +
                # Category Name
         | 
| 7 | 
            +
                attr_accessor :name
         | 
| 8 | 
            +
                # Number of rules in the family
         | 
| 9 | 
            +
                attr_accessor :nvt_count
         | 
| 10 | 
            +
                attr_accessor :is_growing
         | 
| 24 11 |  | 
| 25 | 
            -
                 | 
| 12 | 
            +
                validates :name, :presence => true, :length => {:minimum => 1}
         | 
| 26 13 |  | 
| 27 | 
            -
                 | 
| 28 | 
            -
                 | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
                 | 
| 14 | 
            +
                # Pulls all NVT Families defined on the server.
         | 
| 15 | 
            +
                #
         | 
| 16 | 
            +
                # === Options:
         | 
| 17 | 
            +
                # None.
         | 
| 18 | 
            +
                #--
         | 
| 19 | 
            +
                # TODO: Implement options[:sort_by]
         | 
| 20 | 
            +
                #++
         | 
| 21 | 
            +
                def self.get_all(options = {})
         | 
| 34 22 |  | 
| 35 | 
            -
             | 
| 23 | 
            +
                  req = Nokogiri::XML::Builder.new { |xml|
         | 
| 24 | 
            +
                    xml.get_nvt_families
         | 
| 25 | 
            +
                  }
         | 
| 26 | 
            +
                  
         | 
| 27 | 
            +
                  fams = connection.send_receive(req.doc)
         | 
| 28 | 
            +
                  
         | 
| 29 | 
            +
                  ret = []
         | 
| 30 | 
            +
                  fams.xpath('//family').each { |f|
         | 
| 31 | 
            +
                    ret << from_xml_node(f)
         | 
| 32 | 
            +
                  }
         | 
| 33 | 
            +
                  
         | 
| 34 | 
            +
                  ret
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
                
         | 
| 37 | 
            +
                def self.from_xml_node(node)
         | 
| 38 | 
            +
                  family            = VasNVTFamily.new
         | 
| 39 | 
            +
                  family.name       = extract_value_from('name', node)
         | 
| 40 | 
            +
                  family.nvt_count  = extract_value_from('max_nvt_count', node).to_i
         | 
| 41 | 
            +
                  family.is_growing = (extract_value_from("growing", node).to_i > 0)
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  family
         | 
| 44 | 
            +
                end
         | 
| 36 45 | 
             
              end
         | 
| 37 46 | 
             
            end
         | 
| @@ -1,7 +1,9 @@ | |
| 1 1 | 
             
            require 'vas_base'
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
               | 
| 6 | 
            -
             | 
| 3 | 
            +
            module OpenvasCli
         | 
| 4 | 
            +
              # NOT IMPLEMENTED
         | 
| 5 | 
            +
              class VasOverride < VasBase
         | 
| 6 | 
            +
                attr_accessor :task_id, :original_threat, :rule_id, :is_new
         | 
| 7 | 
            +
                
         | 
| 8 | 
            +
              end
         | 
| 7 9 | 
             
            end
         | 
| @@ -0,0 +1,89 @@ | |
| 1 | 
            +
            require 'active_model'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module OpenvasCli
         | 
| 4 | 
            +
              class VasPeriod
         | 
| 5 | 
            +
                include ActiveModel::Validations
         | 
| 6 | 
            +
                include ActiveModel::Dirty
         | 
| 7 | 
            +
                include Comparable
         | 
| 8 | 
            +
                
         | 
| 9 | 
            +
                attr_reader :number
         | 
| 10 | 
            +
                attr_reader :period
         | 
| 11 | 
            +
                
         | 
| 12 | 
            +
                define_attribute_methods [:number, :period]
         | 
| 13 | 
            +
                
         | 
| 14 | 
            +
                validates :number, :numericality => { :greater_than_or_equal_to => 0 }
         | 
| 15 | 
            +
                validates :period, :inclusion => [:second, :minute, :hour, :day, :month, :year]
         | 
| 16 | 
            +
                
         | 
| 17 | 
            +
                def initialize(params={})
         | 
| 18 | 
            +
                  @number = params[:number] if params[:number]
         | 
| 19 | 
            +
                  @period = params[:period] if params[:period]
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
                
         | 
| 22 | 
            +
                def number=(v)
         | 
| 23 | 
            +
                  number_will_change! unless @number == v
         | 
| 24 | 
            +
                  @number = v
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
                
         | 
| 27 | 
            +
                def period=(v)
         | 
| 28 | 
            +
                  period_will_change! unless @period == v
         | 
| 29 | 
            +
                  @period = v
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
                
         | 
| 32 | 
            +
                def <=> (rhs)
         | 
| 33 | 
            +
                  to_seconds - rhs.to_seconds
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
                
         | 
| 36 | 
            +
                def + (rhs)
         | 
| 37 | 
            +
                  if rhs.kind_of? VasPeriod
         | 
| 38 | 
            +
                    VasPeriod.from_seconds(to_seconds + rhs.to_seconds)
         | 
| 39 | 
            +
                  else
         | 
| 40 | 
            +
                    VasPeriod.from_seconds(to_seconds + rhs)
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
                
         | 
| 44 | 
            +
                def - (rhs)
         | 
| 45 | 
            +
                  if rhs.kind_of? VasPeriod
         | 
| 46 | 
            +
                    VasPeriod.from_seconds(to_seconds - rhs.to_seconds)
         | 
| 47 | 
            +
                  else
         | 
| 48 | 
            +
                    VasPeriod.from_seconds(to_seconds - rhs)
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
                
         | 
| 52 | 
            +
                def to_seconds
         | 
| 53 | 
            +
                  case @period
         | 
| 54 | 
            +
                  when :year
         | 
| 55 | 
            +
                    @number * 365.25 * 86400
         | 
| 56 | 
            +
                  when :month
         | 
| 57 | 
            +
                    @number * 365.25 * 86400 / 12
         | 
| 58 | 
            +
                  when :day
         | 
| 59 | 
            +
                    @number * 86400
         | 
| 60 | 
            +
                  when :hour
         | 
| 61 | 
            +
                    @number * 3600
         | 
| 62 | 
            +
                  when :minute
         | 
| 63 | 
            +
                    @number * 60
         | 
| 64 | 
            +
                  else
         | 
| 65 | 
            +
                    @number
         | 
| 66 | 
            +
                  end
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                def self.from_seconds(seconds)
         | 
| 70 | 
            +
                  if seconds % 86400 == 0
         | 
| 71 | 
            +
                    VasPeriod.new(:number => seconds / 86400, :period => :day)
         | 
| 72 | 
            +
                  elsif seconds % 3600 == 0
         | 
| 73 | 
            +
                    VasPeriod.new(:number => seconds / 3600, :period => :hour)
         | 
| 74 | 
            +
                  elsif seconds % 60 == 0
         | 
| 75 | 
            +
                    VasPeriod.new(:number => seconds / 60, :period => :minute)
         | 
| 76 | 
            +
                  else
         | 
| 77 | 
            +
                    VasPeriod.new(:number => seconds, :period => :second)
         | 
| 78 | 
            +
                  end
         | 
| 79 | 
            +
                end 
         | 
| 80 | 
            +
                
         | 
| 81 | 
            +
                def self.from_months(months)
         | 
| 82 | 
            +
                  if months % 12 == 0
         | 
| 83 | 
            +
                    VasPeriod.new(:number => months / 12, :period => :month)
         | 
| 84 | 
            +
                  else
         | 
| 85 | 
            +
                    VasPeriod.new(:number => months, :period => :month)
         | 
| 86 | 
            +
                  end
         | 
| 87 | 
            +
                end
         | 
| 88 | 
            +
              end
         | 
| 89 | 
            +
            end
         | 
| @@ -1,59 +1,149 @@ | |
| 1 1 | 
             
            require 'vas_base'
         | 
| 2 2 | 
             
            require 'nokogiri'
         | 
| 3 3 |  | 
| 4 | 
            -
             | 
| 5 | 
            -
            #  | 
| 6 | 
            -
            #  | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
               | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 4 | 
            +
            module OpenvasCli
         | 
| 5 | 
            +
              # A name-value pair for OpenVAS configuration preferences.  If inspecting a 
         | 
| 6 | 
            +
              # specific configuration set, +config_id+ will be populated.  If +config_id+ is 
         | 
| 7 | 
            +
              # non-existant, then the preference is a system-wide default.
         | 
| 8 | 
            +
              class VasPreference < VasBase
         | 
| 9 | 
            +
                # Type of value expected :boolean, :choice, :text
         | 
| 10 | 
            +
                attr_accessor :val_type
         | 
| 11 | 
            +
                
         | 
| 12 | 
            +
                attr_accessor :val_type_desc
         | 
| 13 | 
            +
                
         | 
| 14 | 
            +
                # Configuration Identifier.  If +nil+, the preference is a system-wide
         | 
| 15 | 
            +
                # default.
         | 
| 16 | 
            +
                attr_accessor :config_id
         | 
| 17 | 
            +
                
         | 
| 18 | 
            +
                # NVT id
         | 
| 19 | 
            +
                attr_accessor :nvt_id
         | 
| 18 20 |  | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
                 | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
                 | 
| 31 | 
            -
                
         | 
| 32 | 
            -
                 | 
| 33 | 
            -
                   | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
                   | 
| 38 | 
            -
             | 
| 39 | 
            -
                
         | 
| 40 | 
            -
                 | 
| 41 | 
            -
                 | 
| 42 | 
            -
             | 
| 43 | 
            -
                   | 
| 44 | 
            -
                   | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 21 | 
            +
                validates :name, :presence => true, :length=>{:minimum => 1}
         | 
| 22 | 
            +
                
         | 
| 23 | 
            +
                define_attribute_methods [:name, :value]
         | 
| 24 | 
            +
                
         | 
| 25 | 
            +
                def name
         | 
| 26 | 
            +
                  @name
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
                
         | 
| 29 | 
            +
                def name=(val)
         | 
| 30 | 
            +
                  name_will_change! unless val == @name
         | 
| 31 | 
            +
                  @name = val
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
                
         | 
| 34 | 
            +
                def value
         | 
| 35 | 
            +
                  @value
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
                
         | 
| 38 | 
            +
                def value=(val)
         | 
| 39 | 
            +
                  value_will_change! unless val == @value
         | 
| 40 | 
            +
                  @value = val
         | 
| 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 | 
            +
                
         | 
| 49 | 
            +
                def config
         | 
| 50 | 
            +
                  @config ||= VasConfig.get_all(:id => @config_id)[0]
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
                
         | 
| 53 | 
            +
                def nvt
         | 
| 54 | 
            +
                  @nvt ||= VasNVT.get_all(:id => @nvt_id)[0]
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
                
         | 
| 57 | 
            +
                def val_choices
         | 
| 58 | 
            +
                  @val_choices ||= []
         | 
| 59 | 
            +
                end
         | 
| 60 | 
            +
                
         | 
| 61 | 
            +
                def full_name
         | 
| 62 | 
            +
                  if @nvt_id && !@nvt_id.empty?
         | 
| 63 | 
            +
                    "#{nvt.name}[#{@val_type_desc}]:#{@name}"
         | 
| 48 64 | 
             
                  else
         | 
| 49 | 
            -
                     | 
| 65 | 
            +
                    @name
         | 
| 50 66 | 
             
                  end
         | 
| 51 | 
            -
                 | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
                
         | 
| 69 | 
            +
                def save!
         | 
| 70 | 
            +
                  raise "Cannot save a preference that is not tied to a configuration" unless @config_id
         | 
| 71 | 
            +
                  req = Nokogiri::XML::Builder.new { |xml|
         | 
| 72 | 
            +
                    xml.modify_config(:config_id => @config_id) {
         | 
| 73 | 
            +
                      xml.preference {
         | 
| 74 | 
            +
                        xml.nvt(:oid=>@nvt_id) if @nvt_id && !@nvt_id.empty?
         | 
| 75 | 
            +
                        xml.name  { xml.text(full_name) }
         | 
| 76 | 
            +
                        xml.value { 
         | 
| 77 | 
            +
                          if @val_type == :boolean
         | 
| 78 | 
            +
                            xml.text(Base64.encode64(@value ? "yes" : "no"))
         | 
| 79 | 
            +
                          else
         | 
| 80 | 
            +
                            xml.text(Base64.encode64(@value))
         | 
| 81 | 
            +
                          end 
         | 
| 82 | 
            +
                        }
         | 
| 83 | 
            +
                      }
         | 
| 84 | 
            +
                    } 
         | 
| 85 | 
            +
                  }
         | 
| 52 86 |  | 
| 53 | 
            -
             | 
| 54 | 
            -
                 | 
| 55 | 
            -
                ret.sort!{ |a,b| a.config_id <=> b.config_id } if params[:sort_by] == :config_id
         | 
| 87 | 
            +
                  VasPreference.connection.send_receive(req.doc)
         | 
| 88 | 
            +
                end
         | 
| 56 89 |  | 
| 57 | 
            -
                 | 
| 90 | 
            +
                # Pulls Vas preferences.
         | 
| 91 | 
            +
                # === Options:
         | 
| 92 | 
            +
                # [:nvt_oid => [oid]] pulls preferences associated associated with the provided VasNVT.oid
         | 
| 93 | 
            +
                # [:name => [name]] pulls the preference with the specified name
         | 
| 94 | 
            +
                # [:sort_by => [field_name]] filters the results by the provided field name.  Valid symbols are, :name, :value, :config_id.
         | 
| 95 | 
            +
                def self.get_all(options={})
         | 
| 96 | 
            +
                  manual_filter = false
         | 
| 97 | 
            +
                  params = {}
         | 
| 98 | 
            +
                  params[:nvt_oid]    = options[:nvt_oid] if options[:nvt_oid]
         | 
| 99 | 
            +
                  manual_filter       = true              if options[:name]
         | 
| 100 | 
            +
                  
         | 
| 101 | 
            +
                  req = Nokogiri::XML::Builder.new { |xml|
         | 
| 102 | 
            +
                    if params.empty?
         | 
| 103 | 
            +
                      xml.get_preferences
         | 
| 104 | 
            +
                    else
         | 
| 105 | 
            +
                      xml.get_preferences(params)
         | 
| 106 | 
            +
                    end
         | 
| 107 | 
            +
                  }
         | 
| 108 | 
            +
                  
         | 
| 109 | 
            +
                  prefs = connection.send_receive(req.doc)
         | 
| 110 | 
            +
                  ret = []
         | 
| 111 | 
            +
                  prefs.xpath("//preference").each { |p|
         | 
| 112 | 
            +
                    pref       = from_xml_node(p)
         | 
| 113 | 
            +
                    if manual_filter
         | 
| 114 | 
            +
                      ret << pref if options[:name] && options[:name] == pref.name
         | 
| 115 | 
            +
                    else
         | 
| 116 | 
            +
                      ret << pref
         | 
| 117 | 
            +
                    end
         | 
| 118 | 
            +
                  }
         | 
| 119 | 
            +
                  
         | 
| 120 | 
            +
                  ret.sort!{ |a,b| a.name <=> b.name }           if params[:sort_by] == :name
         | 
| 121 | 
            +
                  ret.sort!{ |a,b| a.value <=> b.value }         if params[:sort_by] == :value
         | 
| 122 | 
            +
                  ret.sort!{ |a,b| a.config_id <=> b.config_id } if params[:sort_by] == :config_id
         | 
| 123 | 
            +
                  
         | 
| 124 | 
            +
                  ret    
         | 
| 125 | 
            +
                end
         | 
| 126 | 
            +
                
         | 
| 127 | 
            +
                def self.from_xml_node(node)
         | 
| 128 | 
            +
                  pref        = VasPreference.new
         | 
| 129 | 
            +
                  pref.name   = extract_value_from("name", node)
         | 
| 130 | 
            +
                  pref.value  = extract_value_from("value", node)
         | 
| 131 | 
            +
                  pref.nvt_id = extract_value_from("nvt/@oid", node)
         | 
| 132 | 
            +
                  pref.val_type_desc = extract_value_from("type", node)
         | 
| 133 | 
            +
                  case pref.val_type_desc
         | 
| 134 | 
            +
                    when "checkbox"
         | 
| 135 | 
            +
                      pref.val_type = :boolean
         | 
| 136 | 
            +
                      pref.value = pref.value == "yes" ? true : false
         | 
| 137 | 
            +
                    when "radio"
         | 
| 138 | 
            +
                      pref.val_type = :choice
         | 
| 139 | 
            +
                      pref.val_choices << pref.value
         | 
| 140 | 
            +
                      node.xpath("alt").each { |alt|
         | 
| 141 | 
            +
                        pref.val_choices << alt.text
         | 
| 142 | 
            +
                      }
         | 
| 143 | 
            +
                    else
         | 
| 144 | 
            +
                      pref.val_type = :text
         | 
| 145 | 
            +
                  end
         | 
| 146 | 
            +
                  pref
         | 
| 147 | 
            +
                end
         | 
| 58 148 | 
             
              end
         | 
| 59 149 | 
             
            end
         |