Class: Puppet::Provider::OpnsenseProvider

Inherits:
ResourceApi::SimpleProvider
  • Object
show all
Defined in:
lib/puppet/provider/opnsense_provider.rb

Overview

A base provider for all opnsense providers

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializevoid



12
13
14
15
16
17
# File 'lib/puppet/provider/opnsense_provider.rb', line 12

def initialize
  super
  @config_basedir = '~/.puppet-opnsense'
  @config_suffix = '-config.yaml'
  @resource_list = []
end

Instance Attribute Details

#resource_list=(value) ⇒ Object (writeonly)

writer for testing



8
9
10
# File 'lib/puppet/provider/opnsense_provider.rb', line 8

def resource_list=(value)
  @resource_list = value
end

#resource_type=(value) ⇒ Object (writeonly)

Sets the attribute resource_type

Parameters:

  • value

    the value to set the attribute resource_type to.



9
10
11
# File 'lib/puppet/provider/opnsense_provider.rb', line 9

def resource_type=(value)
  @resource_type = value
end

Instance Method Details

#_edit_single_object(device_name, should) ⇒ Puppet::Util::Execution::ProcessOutput

Parameters:

  • device_name (String)

Returns:

  • (Puppet::Util::Execution::ProcessOutput)


154
155
156
157
158
# File 'lib/puppet/provider/opnsense_provider.rb', line 154

def _edit_single_object(device_name, should)
  args = _translate_puppet_resource_to_command_args('edit', should)
  device_name = should[:device].to_s
  opn_cli_base_cmd(device_name, args)
end

#_fetch_resource_list(device_names) ⇒ void

This method returns an undefined value.

Parameters:

  • device_names (Array<String>)


70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/puppet/provider/opnsense_provider.rb', line 70

def _fetch_resource_list(device_names)
  case @resource_type
  when 'single'
    @resource_list = _get_resource_from_devices(device_names)
  when 'list'
    @resource_list = _get_resources_from_devices(device_names)
  else
    raise Puppet::ResourceError, "Unknown resource type '#{@resource_type}'"
  end

  @resource_list
end

#_find_uuid_by_namevars(namevars, by_column) ⇒ String

Returns uuid.

Parameters:

  • namevars (hash)
  • by_column (String)

Returns:

  • (String)

    uuid



163
164
165
166
167
168
169
170
171
# File 'lib/puppet/provider/opnsense_provider.rb', line 163

def _find_uuid_by_namevars(namevars, by_column)
  resource_found = @resource_list.find do |resource|
    resource[:device] == namevars[:device] && resource[by_column] == namevars[by_column]
  end
  unless resource_found
    raise Puppet::ResourceError, "Could not find uuid for #{namevars}"
  end
  resource_found[:uuid]
end

#_get_resource_from_devices(devices) ⇒ Hash<Symbol>

Parameters:

  • devices (Array<String>)

Returns:

  • (Hash<Symbol>)


85
86
87
88
89
90
91
92
# File 'lib/puppet/provider/opnsense_provider.rb', line 85

def _get_resource_from_devices(devices)
  result = []
  devices.each do |device|
    json_object = get_opn_cli_json_show(device, @group, @command)
    result.push(_translate_json_object_to_puppet_resource(device, json_object))
  end
  result
end

#_get_resources_from_devices(devices) ⇒ Array<Hash<Symbol>>

Parameters:

  • devices (Array<String>)

Returns:

  • (Array<Hash<Symbol>>)


96
97
98
99
100
101
102
103
104
105
# File 'lib/puppet/provider/opnsense_provider.rb', line 96

def _get_resources_from_devices(devices)
  result = []
  devices.each do |device|
    json_list = get_opn_cli_json_list(device, @group, @command)
    json_list.each do |json_list_item|
      result.push(_translate_json_object_to_puppet_resource(device, json_list_item))
    end
  end
  result
end

#array_from_value(value) ⇒ Array<String>

Parameters:

  • value (String)

Returns:

  • (Array<String>)


214
215
216
# File 'lib/puppet/provider/opnsense_provider.rb', line 214

def array_from_value(value)
  value == [] ? value : value.split(',')
end

#bool_from_value(value) ⇒ FalseClass, TrueClass

Parameters:

  • value (String, Integer, Boolean)

Returns:

  • (FalseClass, TrueClass)


201
202
203
204
205
206
207
208
209
210
# File 'lib/puppet/provider/opnsense_provider.rb', line 201

def bool_from_value(value)
  case value
  when true, 'true', 1, '1' then
    true
  when false, 'false', nil, '', 0, '0' then
    false
  else
    raise ArgumentError, 'invalid value for Boolean()'
  end
end

#create(_context, name, should) ⇒ Puppet::Util::Execution::ProcessOutput

Parameters:

  • _context (Puppet::ResourceApi::BaseContext)
  • name (String)
  • should (Hash<Symbol>)

Returns:

  • (Puppet::Util::Execution::ProcessOutput)


111
112
113
114
115
116
117
118
119
120
# File 'lib/puppet/provider/opnsense_provider.rb', line 111

def create(_context, name, should)
  device_name = should[:device].to_s

  if @resource_type == 'single'
    return _edit_single_object(name, should)
  end

  args = _translate_puppet_resource_to_command_args('create', should[@create_key], should)
  opn_cli_base_cmd(device_name, args, '-o', 'json')
end

#delete(_context, name) ⇒ Puppet::Util::Execution::ProcessOutput

Parameters:

  • _context (Puppet::ResourceApi::BaseContext)
  • name (String)

Returns:

  • (Puppet::Util::Execution::ProcessOutput)


142
143
144
145
146
147
148
149
150
# File 'lib/puppet/provider/opnsense_provider.rb', line 142

def delete(_context, name)
  if @resource_type == 'single'
    raise NotImplementedError, "Single resource type #{self.class} has not implemented `delete`"
  end

  uuid = _find_uuid_by_namevars(name, @find_uuid_by_column)
  device_name = name.fetch(:device).to_s
  opn_cli_base_cmd(device_name, [@group, @command, 'delete', uuid, '-o', 'json'])
end

#get(_context, filter) ⇒ Array<Hash<Symbol>>

Parameters:

  • _context (Puppet::ResourceApi::BaseContext)
  • filter (Array<Hash<Symbol>>)

Returns:

  • (Array<Hash<Symbol>>)


22
23
24
25
# File 'lib/puppet/provider/opnsense_provider.rb', line 22

def get(_context, filter)
  device_names = get_device_names_by_filter(filter)
  _fetch_resource_list(device_names)
end

#get_config_path(device_name) ⇒ String

Parameters:

  • device_name (String)

Returns:

  • (String)


195
196
197
# File 'lib/puppet/provider/opnsense_provider.rb', line 195

def get_config_path(device_name)
  File.join(get_config_basedir.to_s, "#{File.basename(device_name)}#{_get_suffix}")
end

#get_configured_devicesArray

Returns:

  • (Array)


44
45
46
47
48
49
50
51
# File 'lib/puppet/provider/opnsense_provider.rb', line 44

def get_configured_devices
  devices = []
  Dir.glob(_get_config_glob_pattern).each do |path|
    device_name = File.basename(path).gsub(%r{#{_get_suffix}$}, '')
    devices.push(device_name)
  end
  devices
end

#get_device_names_by_filter(filter) ⇒ Array

Parameters:

  • filter (Array<Hash<Symbol>>)

Returns:

  • (Array)


29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/puppet/provider/opnsense_provider.rb', line 29

def get_device_names_by_filter(filter)
  if filter.is_a?(Array)
    device_names = filter.map { |item|
      item[:device] if item.is_a?(Hash) && item.include?(:device)
    }.compact.uniq
  end

  if device_names.empty?
    device_names = get_configured_devices
  end

  device_names
end

#get_opn_cli_json_list(device_name, group, command) ⇒ Object

Parameters:

  • device_name (Object)
  • group (Object)
  • command (Object)

Returns:

  • (Object)


222
223
224
225
# File 'lib/puppet/provider/opnsense_provider.rb', line 222

def get_opn_cli_json_list(device_name, group, command)
  json_output = opn_cli_base_cmd(device_name, [group, command, 'list', '-o', 'json'])
  JSON.parse(json_output)
end

#get_opn_cli_json_show(device_name, group, command) ⇒ Object

Parameters:

  • device_name (Object)
  • group (Object)
  • command (Object)

Returns:

  • (Object)


231
232
233
234
# File 'lib/puppet/provider/opnsense_provider.rb', line 231

def get_opn_cli_json_show(device_name, group, command)
  json_output = opn_cli_base_cmd(device_name, [group, command, 'show', '-o', 'json'])
  JSON.parse(json_output)
end

#opn_cli_base_cmd(device_name, *args) ⇒ Puppet::Util::Execution::ProcessOutput

Parameters:

  • device_name (String)
  • args (Array)

Returns:

  • (Puppet::Util::Execution::ProcessOutput)


176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'lib/puppet/provider/opnsense_provider.rb', line 176

def opn_cli_base_cmd(device_name, *args)
  config_path = get_config_path(device_name)
  args.unshift(
      'opn-cli',
      '-c',
      config_path,
    )
  begin
    output = Puppet::Util::Execution.execute(
        args, failonfail: true, combine: true, custom_environment: { 'LC_ALL' => 'en_US.utf8' }
      )
    output
  rescue Puppet::ExecutionFailure => e
    raise Puppet::Error, e.message.to_s
  end
end

#update(_context, name, should) ⇒ Puppet::Util::Execution::ProcessOutput

Parameters:

  • _context (Puppet::ResourceApi::BaseContext)
  • name (String)
  • should (Hash<Symbol>)

Returns:

  • (Puppet::Util::Execution::ProcessOutput)


126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/puppet/provider/opnsense_provider.rb', line 126

def update(_context, name, should)
  device_name = should[:device].to_s

  if @resource_type == 'single'
    return _edit_single_object(device_name, should)
  end

  uuid = _find_uuid_by_namevars(name, @find_uuid_by_column)
  args = _translate_puppet_resource_to_command_args('update', uuid, should)
  device_name = should[:device].to_s
  opn_cli_base_cmd(device_name, args)
end