Class: WireGuard::Admin::Repository

Inherits:
Object
  • Object
show all
Defined in:
lib/wire_guard/admin/repository.rb

Overview

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

Defined Under Namespace

Classes: NetworkAlreadyExists, NetworkNotSpecified, PeerAlreadyExists, UnknownNetwork

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path) ⇒ Repository

Returns a new instance of Repository.



49
50
51
52
# File 'lib/wire_guard/admin/repository.rb', line 49

def initialize(path)
  @path = path
  @backend = PStore.new(@path)
end

Instance Attribute Details

#pathObject (readonly)

Returns the value of attribute path.



47
48
49
# File 'lib/wire_guard/admin/repository.rb', line 47

def path
  @path
end

Instance Method Details

#add_network(network) ⇒ Object

Add a new network

Raises:



97
98
99
100
101
102
103
104
105
# File 'lib/wire_guard/admin/repository.rb', line 97

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) ⇒ Object

Add a peer to the given network

Raises:



120
121
122
123
124
125
126
127
128
# File 'lib/wire_guard/admin/repository.rb', line 120

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) ⇒ Object



145
146
147
# File 'lib/wire_guard/admin/repository.rb', line 145

def clients(network)
  peers(network).select { |p| p.is_a?(Client) }
end

#delete_network(network) ⇒ Object

Raises:



107
108
109
110
111
112
113
114
115
# File 'lib/wire_guard/admin/repository.rb', line 107

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) ⇒ Object

Find a network within all known ones

Raises:



66
67
68
69
70
# File 'lib/wire_guard/admin/repository.rb', line 66

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) ⇒ Object

Find a peer by name within the given network

Raises:



75
76
77
78
79
# File 'lib/wire_guard/admin/repository.rb', line 75

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

#networksObject

Get all networks



57
58
59
60
61
# File 'lib/wire_guard/admin/repository.rb', line 57

def networks
  @backend.transaction do
    @backend.roots
  end
end

#next_address(network) ⇒ Object

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

Raises:



133
134
135
136
137
138
139
# File 'lib/wire_guard/admin/repository.rb', line 133

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) ⇒ Object

Get all peers of the given network

Raises:



84
85
86
87
88
89
90
91
92
# File 'lib/wire_guard/admin/repository.rb', line 84

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

#servers(network) ⇒ Object



141
142
143
# File 'lib/wire_guard/admin/repository.rb', line 141

def servers(network)
  peers(network).select { |p| p.is_a?(Server) }
end