class WireGuard::Admin::Repository

The place where networks, clients and servers can be found and are persisted

Attributes

path[R]

Public Class Methods

new(path) click to toggle source
# File lib/wire_guard/admin/repository.rb, line 58
def initialize(path)
  @path = path
  @backend = PStore.new(@path)
end

Public Instance Methods

add_network(network) click to toggle source

Add a new network

# File lib/wire_guard/admin/repository.rb, line 106
def add_network(network)
  raise ArgumentError, 'network must be an IP address range' unless network.is_a?(IPAddr)

  @backend.transaction do
    raise NetworkAlreadyExists, network if @backend.root?(network)

    @backend[network] = []
  end
end
add_peer(network, peer) click to toggle source

Add a peer to the given network

# File lib/wire_guard/admin/repository.rb, line 132
def add_peer(network, peer)
  raise PeerAlreadyExists.new(peer, network) if find_peer(network, peer.name)

  @backend.transaction do
    raise UnknownNetwork, network unless @backend.root?(network)

    @backend[network] << peer
  end
end
clients(network) click to toggle source
# File lib/wire_guard/admin/repository.rb, line 176
def clients(network)
  peers(network).select { |p| p.is_a?(Client) }
end
delete_network(network) click to toggle source

Delete an existing network

# File lib/wire_guard/admin/repository.rb, line 119
def delete_network(network)
  raise ArgumentError, 'network must be an IP address range' unless network.is_a?(IPAddr)

  @backend.transaction do
    raise UnknownNetwork, network unless @backend.root?(network)

    @backend.delete(network)
  end
end
find_network(network) click to toggle source

Find a network within all known ones

# File lib/wire_guard/admin/repository.rb, line 75
def find_network(network)
  raise ArgumentError, 'network must be an IP address range' unless network.is_a?(IPAddr)

  networks.select { |n| n == network }.first
end
find_peer(network, name) click to toggle source

Find a peer by name within the given network

# File lib/wire_guard/admin/repository.rb, line 84
def find_peer(network, name)
  raise ArgumentError, 'network must be an IP address range' unless network.is_a?(IPAddr)

  peers(network).select { |p| p.name == name }.first
end
networks() click to toggle source

Get all networks

# File lib/wire_guard/admin/repository.rb, line 66
def networks
  @backend.transaction do
    @backend.roots
  end
end
next_address(network) click to toggle source

Find the next address within the given network that is not assigned to a peer

# File lib/wire_guard/admin/repository.rb, line 164
def next_address(network)
  raise ArgumentError, 'network must be an IP address range' unless network.is_a?(IPAddr)

  peers(network).inject(network.succ) do |candidate, peer|
    candidate == peer.ip ? candidate.succ : peer.ip
  end
end
peers(network) click to toggle source

Get all peers of the given network

# File lib/wire_guard/admin/repository.rb, line 93
def peers(network)
  raise ArgumentError, 'network must be an IP address range' unless network.is_a?(IPAddr)

  @backend.transaction do
    raise UnknownNetwork, network unless @backend.root?(network)

    @backend[network]
  end
end
remove_peer(network, peer_or_name) click to toggle source

Remove a peer from the given network

# File lib/wire_guard/admin/repository.rb, line 145
def remove_peer(network, peer_or_name)
  name = if peer_or_name.respond_to?(:name)
           peer_or_name.name
         else
           peer_or_name
         end

  raise UnknownPeer.new(name, network) unless find_peer(network, name)

  @backend.transaction do
    raise UnknownNetwork, network unless @backend.root?(network)

    @backend[network].delete(name)
  end
end
servers(network) click to toggle source
# File lib/wire_guard/admin/repository.rb, line 172
def servers(network)
  peers(network).select { |p| p.is_a?(Server) }
end