Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
fortinet / lib / fortinet / firewallrule.rb
Size: Mime:
# frozen_string_literal: true

module Fortinet
  # Represents a firewall rule
  class FirewallRule
    def initialize(data)
      @data = data
    end

    def self.all
      Fortinet.do('get', '/api/v2/cmdb/firewall/policy')['results'].map { |data| new(data) }
    end

    def self.find(search)
      Fortinet.do('get', "/api/v2/cmdb/firewall/policy?filter=#{search}")['results'].map { |data| new(data) }
    end

    def self.get(number_or_name)
      if number_or_name.to_s =~ /^[0-9]+$/
        data = Fortinet.do('get', "/api/v2/cmdb/firewall/policy/#{number_or_name}")['results'].first
        new(data)
      else
        find("name==#{number_or_name}").first
      end
    end

    def details
      @data
    end

    def set(what, value)
      Fortinet.do('put', "/api/v2/cmdb/firewall/policy/#{@data['policyid']}", { 'policyid' => @data['policyid'], what => value })
    end

    def src=(src)
      src = Array(src)
      set('srcaddr', src.map { |object| Hash['name', object.is_a?(FirewallObject) ? object.name : object] })
    end

    def dst=(dst)
      dst = Array(dst)
      set('dstaddr', dst.map { |object| Hash['name', object.is_a?(FirewallObject) ? object.name : object] })
    end

    def service=(service)
      service = Array(service)
      set('service', service.map { |object| Hash['name', object.is_a?(FirewallService) ? object.name : object] })
    end

    def self.create(details)
      # You cannot set the action on a rule. Raised with Fortinet

      ds = {
        'policyid' => 0,
        'srcintf' => [{ 'name' => 'port1' }],
        'dstintf' => [{ 'name' => 'port1' }],
        'service' => [{ 'name' => 'ALL' }]
      }

      ds['srcintf'] = [{ 'name' => details['srcintf'] }] if details.key?('srcintf')
      ds['dstintf'] = [{ 'name' => details['dstintf'] }] if details.key?('dstintf')

      %w[name schedule comments logtraffic].each do |key|
        ds[key] = details[key] if details.key?(key)
      end

      details['service'] = 'ALL' unless details.key?('service')
      details['service'] = [details['service']] unless details['service'].is_a?(Array)
      ds['service'] = details['service'].map { |object| Hash['name', object.is_a?(FirewallService) ? object.name : object] }

      details['srcaddr'] = 'all' unless details.key?('srcaddr')
      details['srcaddr'] = [details['srcaddr']] unless details['srcaddr'].is_a?(Array)
      ds['srcaddr'] = details['srcaddr'].map { |object| Hash['name', object.is_a?(FirewallObject) ? object.name : object] }

      details['dstaddr'] = 'all' unless details.key?('dstaddr')
      details['dstaddr'] = [details['dstaddr']] unless details['dstaddr'].is_a?(Array)
      ds['dstaddr'] = details['dstaddr'].map { |object| Hash['name', object.is_a?(FirewallObject) ? object.name : object] }

      result = Fortinet.do('post', '/api/v2/cmdb/firewall/policy', ds)
      get(result['results']['mkey'])
    end

    def delete!
      Fortinet.do('delete', "/api/v2/cmdb/firewall/policy/#{@data['policyid']}")
    end

    # action needs wrapping in a legacy json field for now... *shrug* Have raised with Fortinet
    def action=(action)
      set('json', { 'action' => action })
    end

    # Meta program up some nice methods
    # logtraffic = 'disable', 'utm', 'all'
    %w[name status logtraffic comments].each do |property|
      define_method property do
        @data[property]
      end

      next if method_defined?("#{property}=")

      define_method "#{property}=" do |value|
        set(property, value)
      end
    end
  end
end