Repository URL to install this package:
|
Version:
0.1.0 ▾
|
# 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