Class: RCS::Common::WinFirewall::Rule

Inherits:
Object
  • Object
show all
Includes:
Resolver
Defined in:
lib/rcs-common/winfirewall.rb

Overview

Represent a Windows Firewall rule.

Constant Summary collapse

ATTRIBUTES =
%i[direction action local_ip remote_ip local_port remote_port name protocol profiles enabled grouping edge_traversal]
RULE_GROUP =
'RCS Firewall Rules'

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Resolver

#resolve_dns, #resolved_dns_cache

Constructor Details

#initialize(attributes = {}) ⇒ Rule

Returns a new instance of Rule.



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/rcs-common/winfirewall.rb', line 21

def initialize(attributes = {})
  # Default attribute values
  @attributes = {
    grouping: RULE_GROUP
  }

  # Merge default attributes with the given ones
  # and remove invalid attributes
  attributes.symbolize_keys! if attributes.respond_to?(:symbolize_keys!)
  attributes.reject! { |key| !ATTRIBUTES.include?(key) }
  @attributes.merge!(attributes)

  # Define getters and setters
  ATTRIBUTES.each do |name|
    define_singleton_method(name) { @attributes[name] }
    define_singleton_method("#{name}=") { |value| @attributes[name] = value }
  end
end

Instance Attribute Details

#attributesObject (readonly)

Returns the value of attribute attributes.



19
20
21
# File 'lib/rcs-common/winfirewall.rb', line 19

def attributes
  @attributes
end

Instance Method Details

#delObject



84
85
86
87
88
89
90
# File 'lib/rcs-common/winfirewall.rb', line 84

def del
  resolve_addresses

  only = %i[dir profile program service localip remoteip localport remoteport protocol name]

  Advfirewall.call("firewall delete rule #{stringify_attributes(only)}")
end

#resolve_addresses(_raise = false) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/rcs-common/winfirewall.rb', line 44

def resolve_addresses(_raise = false)
  return if @addresses_resolved

  %i[remote_ip local_ip].each do |name|
    next unless @attributes[name]

    addresses = [@attributes[name]].flatten

    addresses.each_with_index do |address, index|
      next if %w[any localsubnet dns dhcp wins defaultgateway].include?(address.to_s.downcase)
      next if address.to_s =~ Resolv::IPv4::Regex
      next if address.to_s =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)\/(\d+)/

      is_localhost =  Socket.gethostname.casecmp(address).zero?

      addresses[index] = if is_localhost
        '127.0.0.1'
      elsif _raise
        resolve_dns(address)
      else
        resolve_dns(address) rescue address
      end
    end

    @attributes[name] = addresses.size == 1 ? addresses[0] : addresses
  end

  @addresses_resolved = true
end

#resolve_addresses!Object



40
41
42
# File 'lib/rcs-common/winfirewall.rb', line 40

def resolve_addresses!
  resolve_addresses(true)
end

#saveObject



74
75
76
77
78
79
80
81
82
# File 'lib/rcs-common/winfirewall.rb', line 74

def save
  resolve_addresses!

  if Advfirewall.call("firewall add rule #{stringify_attributes}").ok?
    true
  else
    raise "Unable to save firewall rule #{@attributes[:name]}"
  end
end