wg-admin 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 70eb93699c05f931e8904d01f703d4ec3e63d02cebd0853acd13c63a903cf02d
4
- data.tar.gz: 43e8d87dc246fd7d523ef2ffe9f72b2403a19f47a83aa13a308cf6ed5fe71964
3
+ metadata.gz: e4361bef43715dc99416edb18c4cab3f0229ca8d38072903726901a2578d8324
4
+ data.tar.gz: 042fa0ab74e47e2ec33429935598b120be011633cbd37e6da5334d110d0db629
5
5
  SHA512:
6
- metadata.gz: 730e5df74d993c754ac57cdf7a8a91559593ede4d8c4455145fbd3e0673f7d81869ae673ce1d07fc9819b40d5a690b7cfc6aea1d322a40304483385a42ca0fd7
7
- data.tar.gz: c65568ea9955110c3b5f66940258d1bc7b07ce9bf2c912f997eea600713a9310975b383658d6540a13e6c727a040fbde04c8a46184fd9cbcc35fd50dbd8ee9df
6
+ metadata.gz: b5a62ccbe1dcce89c49946c4d066cc3f99dcb60a3baa9464375798acfe4efc2907dd27735fdda39e8922b6bb36c25cabd0f958eb11c4e2abb0b6bc226f292c3b
7
+ data.tar.gz: ad2fc708a5282a30052895aae1fd118ab97c2815021ac65a99c5e7444fce02abc1571d43b5a0549bc668efc933531b282fd102807e78c9f738abc30d4b60f735
@@ -0,0 +1,14 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: "/"
5
+ schedule:
6
+ interval: daily
7
+ open-pull-requests-limit: 10
8
+ ignore:
9
+ - dependency-name: rubocop-rspec
10
+ versions:
11
+ - 1.41.0
12
+ commit-message:
13
+ prefix: bump
14
+ include: scope
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  mkmf.log
2
2
  pkg
3
+ .rake_tasks
data/.rubocop.yml CHANGED
@@ -1,7 +1,7 @@
1
1
  require: rubocop-rspec
2
2
 
3
3
  AllCops:
4
- TargetRubyVersion: 2.7
4
+ TargetRubyVersion: 3.0
5
5
 
6
6
  DisplayCopNames:
7
7
  Enabled: true
@@ -9,9 +9,39 @@ AllCops:
9
9
  DisplayStyleGuide:
10
10
  Enabled: true
11
11
 
12
+ NewCops: enable
13
+
12
14
  Metrics/BlockLength:
13
15
  Exclude:
14
16
  - spec/**/*
15
17
 
16
18
  Layout/LineLength:
17
19
  Max: 180
20
+
21
+ Layout/SpaceAroundMethodCallOperator:
22
+ Enabled: true
23
+
24
+ Lint/RaiseException:
25
+ Enabled: true
26
+
27
+ Lint/StructNewOverride:
28
+ Enabled: true
29
+
30
+ Style/ExponentialNotation:
31
+ Enabled: true
32
+
33
+ Style/HashEachMethods:
34
+ Enabled: true
35
+
36
+ Style/HashTransformKeys:
37
+ Enabled: true
38
+
39
+ Style/HashTransformValues:
40
+ Enabled: true
41
+
42
+ RSpec/NestedGroups:
43
+ Max: 5
44
+
45
+ Metrics/CyclomaticComplexity:
46
+ Exclude:
47
+ - "lib/wire_guard/admin/**/*"
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.7.1
1
+ 3.0.2
data/.travis.yml CHANGED
@@ -6,6 +6,6 @@ before_install:
6
6
  - sudo apt-get --yes update
7
7
  - sudo apt-get --yes install wireguard
8
8
  rvm:
9
- - 2.7.1
10
- - 2.6.6
11
- - 2.5.8
9
+ - 2.6.8
10
+ - 2.7.4
11
+ - 3.0.2
data/Gemfile.lock CHANGED
@@ -1,53 +1,66 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- wg-admin (0.0.2)
5
- thor (~> 1.0.1)
4
+ wg-admin (0.0.3)
5
+ thor
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- aruba (0.14.14)
11
- childprocess (>= 0.6.3, < 4.0.0)
12
- contracts (~> 0.9)
13
- cucumber (>= 1.3.19)
14
- ffi (~> 1.9)
15
- rspec-expectations (>= 2.99)
16
- thor (>= 0.19, < 2.0)
17
- ast (2.4.0)
18
- backports (3.17.1)
10
+ aruba (2.0.0)
11
+ bundler (>= 1.17, < 3.0)
12
+ childprocess (>= 2.0, < 5.0)
13
+ contracts (>= 0.16.0, < 0.18.0)
14
+ cucumber (>= 4.0, < 8.0)
15
+ rspec-expectations (~> 3.4)
16
+ thor (~> 1.0)
17
+ ast (2.4.2)
19
18
  builder (3.2.4)
20
19
  byebug (11.1.3)
21
- childprocess (3.0.0)
22
- coderay (1.1.2)
23
- contracts (0.16.0)
24
- cucumber (3.1.2)
25
- builder (>= 2.1.2)
26
- cucumber-core (~> 3.2.0)
27
- cucumber-expressions (~> 6.0.1)
28
- cucumber-wire (~> 0.0.1)
29
- diff-lcs (~> 1.3)
30
- gherkin (~> 5.1.0)
31
- multi_json (>= 1.7.5, < 2.0)
32
- multi_test (>= 0.1.2)
33
- cucumber-core (3.2.1)
34
- backports (>= 3.8.0)
35
- cucumber-tag_expressions (~> 1.1.0)
36
- gherkin (~> 5.0)
37
- cucumber-expressions (6.0.1)
38
- cucumber-tag_expressions (1.1.1)
39
- cucumber-wire (0.0.1)
40
- diff-lcs (1.3)
41
- ffi (1.12.2)
42
- formatador (0.2.5)
43
- gherkin (5.1.0)
44
- guard (2.16.2)
20
+ childprocess (4.1.0)
21
+ coderay (1.1.3)
22
+ contracts (0.17)
23
+ cucumber (7.0.0)
24
+ builder (~> 3.2, >= 3.2.4)
25
+ cucumber-core (~> 10.0, >= 10.0.1)
26
+ cucumber-create-meta (~> 6.0, >= 6.0.1)
27
+ cucumber-cucumber-expressions (~> 12.1, >= 12.1.1)
28
+ cucumber-gherkin (~> 20.0, >= 20.0.1)
29
+ cucumber-html-formatter (~> 16.0, >= 16.0.1)
30
+ cucumber-messages (~> 17.0, >= 17.0.1)
31
+ cucumber-wire (~> 6.0, >= 6.0.1)
32
+ diff-lcs (~> 1.4, >= 1.4.4)
33
+ mime-types (~> 3.3, >= 3.3.1)
34
+ multi_test (~> 0.1, >= 0.1.2)
35
+ sys-uname (~> 1.2, >= 1.2.2)
36
+ cucumber-core (10.0.1)
37
+ cucumber-gherkin (~> 20.0, >= 20.0.1)
38
+ cucumber-messages (~> 17.0, >= 17.0.1)
39
+ cucumber-tag-expressions (~> 3.0, >= 3.0.1)
40
+ cucumber-create-meta (6.0.1)
41
+ cucumber-messages (~> 17.0, >= 17.0.1)
42
+ sys-uname (~> 1.2, >= 1.2.2)
43
+ cucumber-cucumber-expressions (12.1.1)
44
+ cucumber-gherkin (20.0.1)
45
+ cucumber-messages (~> 17.0, >= 17.0.1)
46
+ cucumber-html-formatter (16.0.1)
47
+ cucumber-messages (~> 17.0, >= 17.0.1)
48
+ cucumber-messages (17.0.1)
49
+ cucumber-tag-expressions (3.0.1)
50
+ cucumber-wire (6.1.0)
51
+ cucumber-core (~> 10.0, >= 10.0.1)
52
+ cucumber-cucumber-expressions (~> 12.1, >= 12.1.1)
53
+ cucumber-messages (~> 17.0, >= 17.0.1)
54
+ diff-lcs (1.4.4)
55
+ ffi (1.15.3)
56
+ formatador (0.3.0)
57
+ guard (2.18.0)
45
58
  formatador (>= 0.2.4)
46
59
  listen (>= 2.7, < 4.0)
47
60
  lumberjack (>= 1.0.12, < 2.0)
48
61
  nenv (~> 0.1)
49
62
  notiffany (~> 0.0)
50
- pry (>= 0.9.12)
63
+ pry (>= 0.13.0)
51
64
  shellany (~> 0.0)
52
65
  thor (>= 0.18.1)
53
66
  guard-bundler (3.0.0)
@@ -60,76 +73,89 @@ GEM
60
73
  guard-compat (~> 1.1)
61
74
  rspec (>= 2.99.0, < 4.0)
62
75
  inifile (3.0.0)
63
- jaro_winkler (1.5.4)
64
- listen (3.2.1)
76
+ listen (3.6.0)
65
77
  rb-fsevent (~> 0.10, >= 0.10.3)
66
78
  rb-inotify (~> 0.9, >= 0.9.10)
67
- lumberjack (1.2.4)
68
- method_source (0.9.2)
69
- multi_json (1.14.1)
79
+ lumberjack (1.2.8)
80
+ method_source (1.0.0)
81
+ mime-types (3.3.1)
82
+ mime-types-data (~> 3.2015)
83
+ mime-types-data (3.2021.0704)
70
84
  multi_test (0.1.2)
71
85
  nenv (0.3.0)
72
86
  notiffany (0.1.3)
73
87
  nenv (~> 0.1)
74
88
  shellany (~> 0.0)
75
- parallel (1.19.1)
76
- parser (2.7.1.2)
77
- ast (~> 2.4.0)
78
- pry (0.12.2)
79
- coderay (~> 1.1.0)
80
- method_source (~> 0.9.0)
81
- pry-byebug (3.7.0)
89
+ parallel (1.20.1)
90
+ parser (3.0.2.0)
91
+ ast (~> 2.4.1)
92
+ pry (0.14.1)
93
+ coderay (~> 1.1)
94
+ method_source (~> 1.0)
95
+ pry-byebug (3.8.0)
82
96
  byebug (~> 11.0)
83
97
  pry (~> 0.10)
84
98
  rainbow (3.0.0)
85
- rake (13.0.1)
86
- rb-fsevent (0.10.4)
99
+ rake (13.0.6)
100
+ rb-fsevent (0.11.0)
87
101
  rb-inotify (0.10.1)
88
102
  ffi (~> 1.0)
89
- rspec (3.9.0)
90
- rspec-core (~> 3.9.0)
91
- rspec-expectations (~> 3.9.0)
92
- rspec-mocks (~> 3.9.0)
93
- rspec-core (3.9.1)
94
- rspec-support (~> 3.9.1)
95
- rspec-expectations (3.9.1)
103
+ regexp_parser (2.1.1)
104
+ rexml (3.2.5)
105
+ rspec (3.10.0)
106
+ rspec-core (~> 3.10.0)
107
+ rspec-expectations (~> 3.10.0)
108
+ rspec-mocks (~> 3.10.0)
109
+ rspec-core (3.10.1)
110
+ rspec-support (~> 3.10.0)
111
+ rspec-expectations (3.10.1)
96
112
  diff-lcs (>= 1.2.0, < 2.0)
97
- rspec-support (~> 3.9.0)
98
- rspec-mocks (3.9.1)
113
+ rspec-support (~> 3.10.0)
114
+ rspec-mocks (3.10.2)
99
115
  diff-lcs (>= 1.2.0, < 2.0)
100
- rspec-support (~> 3.9.0)
101
- rspec-support (3.9.2)
102
- rubocop (0.79.0)
103
- jaro_winkler (~> 1.5.1)
116
+ rspec-support (~> 3.10.0)
117
+ rspec-support (3.10.2)
118
+ rubocop (1.19.0)
104
119
  parallel (~> 1.10)
105
- parser (>= 2.7.0.1)
120
+ parser (>= 3.0.0.0)
106
121
  rainbow (>= 2.2.2, < 4.0)
122
+ regexp_parser (>= 1.8, < 3.0)
123
+ rexml
124
+ rubocop-ast (>= 1.9.1, < 2.0)
107
125
  ruby-progressbar (~> 1.7)
108
- unicode-display_width (>= 1.4.0, < 1.7)
109
- rubocop-rspec (1.37.1)
110
- rubocop (>= 0.68.1)
111
- ruby-progressbar (1.10.1)
126
+ unicode-display_width (>= 1.4.0, < 3.0)
127
+ rubocop-ast (1.10.0)
128
+ parser (>= 3.0.1.1)
129
+ rubocop-rake (0.6.0)
130
+ rubocop (~> 1.0)
131
+ rubocop-rspec (2.4.0)
132
+ rubocop (~> 1.0)
133
+ rubocop-ast (>= 1.1.0)
134
+ ruby-progressbar (1.11.0)
112
135
  shellany (0.0.1)
113
- thor (1.0.1)
114
- unicode-display_width (1.6.1)
136
+ sys-uname (1.2.2)
137
+ ffi (~> 1.1)
138
+ thor (1.1.0)
139
+ unicode-display_width (2.0.0)
115
140
 
116
141
  PLATFORMS
117
142
  ruby
118
143
 
119
144
  DEPENDENCIES
120
- aruba (~> 0.14.14)
145
+ aruba
121
146
  bundler (~> 2.1)
122
- guard (~> 2.16.1)
123
- guard-bundler (~> 3.0.0)
124
- guard-rspec (~> 4.7.3)
125
- inifile (~> 3.0.0)
126
- pry (~> 0.12.2)
127
- pry-byebug (~> 3.7.0)
128
- rake (~> 13.0.1)
129
- rspec (~> 3.9.0)
130
- rubocop (~> 0.79.0)
131
- rubocop-rspec (~> 1.37.1)
147
+ guard
148
+ guard-bundler
149
+ guard-rspec
150
+ inifile
151
+ pry
152
+ pry-byebug
153
+ rake
154
+ rspec
155
+ rubocop
156
+ rubocop-rake
157
+ rubocop-rspec
132
158
  wg-admin!
133
159
 
134
160
  BUNDLED WITH
135
- 2.1.4
161
+ 2.2.22
data/TODO.markdown CHANGED
@@ -1,3 +1,3 @@
1
- * if no network is specified, and there is one and only one, use that.
2
- * pass the private key via command line
3
- * pass the public key via command line (useful when `wg` is not installed)
1
+ # TODO
2
+
3
+ *
data/exe/wg-admin CHANGED
@@ -1,6 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
+ $LOAD_PATH.unshift File.expand_path('../lib', __dir__)
5
+
4
6
  require 'bundler/setup'
5
7
  require 'wire_guard/admin/cli'
6
8
 
@@ -51,12 +51,19 @@ Available'
51
51
  def config(name)
52
52
  warn "Using database #{repository.path}" if options[:verbose]
53
53
  peer = repository.find_peer(network, name)
54
-
55
54
  case peer
56
55
  when Server
57
- puts Templates::Server.new(peer, repository.clients(network)).render
56
+ puts Templates::Server.new(
57
+ server: peer,
58
+ network: network,
59
+ clients: repository.clients(network)
60
+ ).render
58
61
  when Client
59
- puts Templates::Client.new(peer, repository.servers(network)).render
62
+ puts Templates::Client.new(
63
+ client: peer,
64
+ network: network,
65
+ servers: repository.servers(network)
66
+ ).render
60
67
  else
61
68
  raise "No template defined for #{peer}"
62
69
  end
@@ -10,15 +10,18 @@ module WireGuard
10
10
  class Clients < Thor
11
11
  extend ClassHelpers
12
12
  include InstanceHelpers
13
+ default_command :list
13
14
 
14
- # rubocop:disable Metrics/AbcSize
15
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
15
16
  desc 'add NAME', 'Adds a new client with the given NAME'
16
17
  long_desc 'Adds a new client to the configuration database.'
17
18
  method_option :network, desc: 'network', aliases: '-n', default: default_network
18
19
  method_option :ip, desc: 'the IP address of the new client', aliases: '-i', required: false
20
+ method_option :private_key, desc: 'The private key of the new client', aliases: '-P', required: false
19
21
  def add(name)
20
22
  warn "Using database #{repository.path}" if options[:verbose]
21
23
  client = Client.new(name: name, ip: ip)
24
+ client.private_key = options[:private_key] if options[:private_key]
22
25
  repository.add_peer(network, client)
23
26
  if options[:verbose]
24
27
  warn 'New client was successfully added:'
@@ -29,6 +32,17 @@ module WireGuard
29
32
  raise Thor::Error, "Error: #{e.message}"
30
33
  end
31
34
 
35
+ desc 'remove NAME', 'Removes the client with the given NAME'
36
+ long_desc 'Removes an existing client from the configuration database.'
37
+ method_option :network, desc: 'network', aliases: '-n', default: default_network
38
+ def remove(name)
39
+ warn "Using database #{repository.path}" if options[:verbose]
40
+ repository.remove_peer(network, name)
41
+ warn 'Client was successfully removed.' if options[:verbose]
42
+ rescue StandardError => e
43
+ raise Thor::Error, "Error: #{e.message}"
44
+ end
45
+
32
46
  desc 'list', 'Lists all clients'
33
47
  long_desc 'For a given network, lists all clients in the configuration database.'
34
48
  method_option :network, desc: 'network', aliases: '-n', default: default_network
@@ -43,7 +57,7 @@ module WireGuard
43
57
  rescue StandardError => e
44
58
  raise Thor::Error, "Error: #{e.message}"
45
59
  end
46
- # rubocop:enable Metrics/AbcSize
60
+ # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
47
61
  end
48
62
  end
49
63
  end
@@ -9,11 +9,11 @@ module WireGuard
9
9
  #
10
10
  module ClassHelpers
11
11
  def default_network
12
- if repository.networks.size != 1
13
- ENV['WG_ADMIN_NETWORK']
14
- else
12
+ if repository.networks.size == 1
15
13
  nw = repository.networks.first
16
14
  ENV.fetch('WG_ADMIN_NETWORK', "#{nw}/#{nw.prefix}")
15
+ else
16
+ ENV['WG_ADMIN_NETWORK']
17
17
  end
18
18
  end
19
19
 
@@ -11,8 +11,8 @@ module WireGuard
11
11
  class Networks < Thor
12
12
  extend ClassHelpers
13
13
  include InstanceHelpers
14
+ default_command :list
14
15
 
15
- # rubocop:disable Metrics/AbcSize
16
16
  desc 'list', 'Lists all known networks'
17
17
  long_desc 'List the networks in the configuration database.'
18
18
  def list
@@ -27,8 +27,6 @@ module WireGuard
27
27
  rescue StandardError => e
28
28
  raise Thor::Error, "Error: #{e.message}"
29
29
  end
30
- # rubocop:enable Metrics/AbcSize
31
-
32
30
  desc 'add NETWORK', 'Adds a new network'
33
31
  long_desc 'Adds a new network to the configuration database.'
34
32
  def add(network)
@@ -10,6 +10,7 @@ module WireGuard
10
10
  class Peers < Thor
11
11
  extend ClassHelpers
12
12
  include InstanceHelpers
13
+ default_command :list
13
14
 
14
15
  # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
15
16
  desc 'list', 'Lists all peers'
@@ -21,7 +22,7 @@ module WireGuard
21
22
  warn "No clients in network #{network}." if repository.networks.empty?
22
23
  end
23
24
  repository.peers(network).each do |peer|
24
- if STDOUT.tty?
25
+ if $stdout.tty?
25
26
  puts peer
26
27
  else
27
28
  puts peer.name
@@ -10,20 +10,23 @@ module WireGuard
10
10
  class Servers < Thor
11
11
  extend ClassHelpers
12
12
  include InstanceHelpers
13
+ default_command :list
13
14
 
14
- # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/AbcSize
15
+ # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
15
16
  desc 'add NAME', 'Adds a new server'
16
17
  long_desc 'Adds a new server with the given public DNS NAME to the configuration database.'
17
18
  method_option :network, desc: 'network', aliases: '-n', default: default_network
18
19
  method_option :ip, desc: 'the (private) IP address of the new server (within the VPN)', aliases: '-i', required: false
19
20
  method_option :port, desc: 'port to listen on', aliases: '-p', required: false
20
- method_option :allowed_ips, desc: 'The range of allowed IP addresses that this server is routing', aliases: '-a', required: false
21
+ method_option :allowed_ips, desc: 'The range of allowed IP addresses that this server is routing. Defaults to the network.', aliases: '-a', required: false
21
22
  method_option :device, desc: 'The network device used for forwarding traffic', aliases: '-d', required: false
23
+ method_option :private_key, desc: 'The private key of the new server', aliases: '-P', required: false
22
24
  def add(name)
23
25
  warn "Using database #{repository.path}" if options[:verbose]
24
26
  server = Server.new(name: name, ip: ip, allowed_ips: options[:allowed_ips] || repository.find_network(network))
25
27
  server.device = options[:device] if options[:device]
26
28
  server.port = options[:port] if options[:port]
29
+ server.private_key = options[:private_key] if options[:private_key]
27
30
  repository.add_peer(network, server)
28
31
  if options[:verbose]
29
32
  warn 'New server was successfully added:'
@@ -34,6 +37,17 @@ module WireGuard
34
37
  raise Thor::Error, "Error: #{e.message}"
35
38
  end
36
39
 
40
+ desc 'remove NAME', 'Removes the server with the given NAME'
41
+ long_desc 'Removes an existing server from the configuration database.'
42
+ method_option :network, desc: 'network', aliases: '-n', default: default_network
43
+ def remove(name)
44
+ warn "Using database #{repository.path}" if options[:verbose]
45
+ repository.remove_peer(network, name)
46
+ warn 'Server was successfully removed.' if options[:verbose]
47
+ rescue StandardError => e
48
+ raise Thor::Error, "Error: #{e.message}"
49
+ end
50
+
37
51
  desc 'list', 'Lists all servers'
38
52
  long_desc 'For a given network, lists all servers in the configuration database.'
39
53
  method_option :network, desc: 'network', aliases: '-n', default: default_network
@@ -48,7 +62,7 @@ module WireGuard
48
62
  rescue StandardError => e
49
63
  raise Thor::Error, "Error: #{e.message}"
50
64
  end
51
- # rubocop:enable Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/AbcSize
65
+ # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
52
66
  end
53
67
  end
54
68
  end
@@ -22,22 +22,23 @@ module WireGuard
22
22
  # @see https://github.com/pirate/wireguard-docs#peernodedevice
23
23
  #
24
24
  class Client
25
- attr_reader :name, :ip, :private_key, :public_key
25
+ attr_reader :name, :ip, :public_key, :private_key
26
26
 
27
- # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
28
- def initialize(name:, ip:, private_key: nil, public_key: nil)
27
+ def initialize(name:, ip:, private_key: nil)
29
28
  raise ArgumentError, 'name must be present' if name.nil?
30
29
  raise ArgumentError, 'name must not be empty' if name.empty?
31
30
  raise ArgumentError, 'ip must be present' if ip.nil?
32
31
  raise ArgumentError, 'private_key must not be empty' if private_key&.empty?
33
- raise ArgumentError, 'public_key must not be empty' if public_key&.empty?
34
32
 
35
33
  @name = name
36
34
  @ip = ip
37
- @private_key = private_key || generate_private_key
38
- @public_key = public_key || generate_public_key
35
+ self.private_key = private_key || generate_private_key
36
+ end
37
+
38
+ def private_key=(private_key)
39
+ @private_key = private_key
40
+ @public_key = generate_public_key
39
41
  end
40
- # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
41
42
 
42
43
  def to_s
43
44
  "#{self.class.name.split('::').last} #{name}: #{ip}"
@@ -52,7 +53,11 @@ module WireGuard
52
53
  end
53
54
 
54
55
  def ==(other)
55
- name == other.name
56
+ name == if other.respond_to?(:name)
57
+ other.name
58
+ else
59
+ other
60
+ end
56
61
  end
57
62
 
58
63
  private
@@ -61,7 +66,7 @@ module WireGuard
61
66
  Open3.popen3('wg pubkey') do |stdin, stdout, stderr, waiter|
62
67
  stdin.write(private_key)
63
68
  stdin.close
64
- raise InvocationError, stderr.lines unless waiter.value.success?
69
+ raise InvocationError, stderr.read.lines unless waiter.value.success?
65
70
 
66
71
  stdout.read.chomp
67
72
  end
@@ -44,6 +44,15 @@ module WireGuard
44
44
  end
45
45
  end
46
46
 
47
+ #
48
+ # Raised if the peer is not known
49
+ #
50
+ class UnknownPeer < StandardError
51
+ def initialize(peer, network)
52
+ super("Peer #{peer} is unknown in network #{network}.")
53
+ end
54
+ end
55
+
47
56
  attr_reader :path
48
57
 
49
58
  def initialize(path)
@@ -104,6 +113,9 @@ module WireGuard
104
113
  end
105
114
  end
106
115
 
116
+ #
117
+ # Delete an existing network
118
+ #
107
119
  def delete_network(network)
108
120
  raise ArgumentError, 'network must be an IP address range' unless network.is_a?(IPAddr)
109
121
 
@@ -127,6 +139,25 @@ module WireGuard
127
139
  end
128
140
  end
129
141
 
142
+ #
143
+ # Remove a peer from the given network
144
+ #
145
+ def remove_peer(network, peer_or_name)
146
+ name = if peer_or_name.respond_to?(:name)
147
+ peer_or_name.name
148
+ else
149
+ peer_or_name
150
+ end
151
+
152
+ raise UnknownPeer.new(name, network) unless find_peer(network, name)
153
+
154
+ @backend.transaction do
155
+ raise UnknownNetwork, network unless @backend.root?(network)
156
+
157
+ @backend[network].delete(name)
158
+ end
159
+ end
160
+
130
161
  #
131
162
  # Find the next address within the given network that is not assigned to a peer
132
163
  #
@@ -18,13 +18,12 @@ module WireGuard
18
18
  def initialize(
19
19
  name:,
20
20
  ip:,
21
+ allowed_ips:,
21
22
  private_key: nil,
22
- public_key: nil,
23
23
  port: 51_820,
24
- allowed_ips:,
25
24
  device: 'eth0'
26
25
  )
27
- super(name: name, ip: ip, private_key: private_key, public_key: public_key)
26
+ super(name: name, ip: ip, private_key: private_key)
28
27
 
29
28
  raise ArgumentError, 'port must be present' if port.nil?
30
29
  raise ArgumentError, 'port number is invalid' unless (1..65_535).cover?(port.to_i)
@@ -16,9 +16,9 @@ module WireGuard
16
16
 
17
17
  [Interface]
18
18
  PrivateKey = <%= client.private_key %>
19
- Address = <%= client.ip %>/24
20
-
19
+ Address = <%= client.ip %>/<%= network.prefix %>
21
20
  <% servers.each do |server| %>
21
+
22
22
  [Peer]
23
23
  PublicKey = <%= server.public_key %>
24
24
  EndPoint = <%= server.name %>:<%= server.port %>
@@ -28,13 +28,13 @@ module WireGuard
28
28
  CLIENT_TEMPLATE
29
29
  end
30
30
 
31
- attr_reader :client, :servers
31
+ attr_reader :client, :network, :servers
32
32
 
33
- def initialize(client, servers)
33
+ def initialize(client:, network:, servers:)
34
34
  @client = client
35
+ @network = network
35
36
  @servers = servers
36
- @template = self.class.template
37
- super(@template)
37
+ super(self.class.template, trim_mode: '<>')
38
38
  end
39
39
 
40
40
  def render
@@ -15,28 +15,28 @@ module WireGuard
15
15
  # generated by wg-admin
16
16
 
17
17
  [Interface]
18
- Address = <%= server.ip %>/24
18
+ Address = <%= server.ip %>/<%= network.prefix %>
19
19
  ListenPort = <%= server.port %>
20
20
  PrivateKey = <%= server.private_key %>
21
21
  # PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o <%= server.device %> -j MASQUERADE
22
22
  # PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o <%= server.device %> -j MASQUERADE
23
-
24
23
  <% clients.each do |client| %>
24
+
25
25
  [Peer]
26
26
  # Name = <%= client.name %>
27
27
  PublicKey = <%= client.public_key %>
28
- AllowedIPs = <%= client.ip %>/32
28
+ AllowedIPs = <%= client.ip %>/<%= client.ip.prefix %>
29
29
  <% end %>
30
30
  SERVER_TEMPLATE
31
31
  end
32
32
 
33
- attr_reader :server, :clients
33
+ attr_reader :server, :network, :clients
34
34
 
35
- def initialize(server, clients)
35
+ def initialize(server:, network:, clients:)
36
36
  @server = server
37
+ @network = network
37
38
  @clients = clients
38
- @template = self.class.template
39
- super(@template)
39
+ super(self.class.template, trim_mode: '<>')
40
40
  end
41
41
 
42
42
  def render
@@ -2,6 +2,6 @@
2
2
 
3
3
  module WireGuard
4
4
  module Admin
5
- VERSION = '0.0.2'
5
+ VERSION = '0.0.3'
6
6
  end
7
7
  end
data/wg-admin.gemspec CHANGED
@@ -21,20 +21,22 @@ Gem::Specification.new do |spec|
21
21
  spec.bindir = 'exe'
22
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
23
  spec.require_paths = ['lib']
24
+ spec.required_ruby_version = '~> 3.0'
24
25
 
25
- spec.add_runtime_dependency 'thor', '~> 1.0.1'
26
+ spec.add_runtime_dependency 'thor'
26
27
 
27
- spec.add_development_dependency 'aruba', '~> 0.14.14'
28
- spec.add_development_dependency 'bundler', '~> 2.1'
29
- spec.add_development_dependency 'guard', '~> 2.16.1'
30
- spec.add_development_dependency 'guard-bundler', '~> 3.0.0'
31
- spec.add_development_dependency 'guard-rspec', '~> 4.7.3'
32
- spec.add_development_dependency 'inifile', '~> 3.0.0'
33
- spec.add_development_dependency 'pry', '~> 0.12.2'
34
- spec.add_development_dependency 'pry-byebug', '~> 3.7.0'
35
- spec.add_development_dependency 'rake', '~> 13.0.1'
36
- spec.add_development_dependency 'rspec', '~> 3.9.0'
37
- spec.add_development_dependency 'rubocop', '~> 0.79.0'
38
- spec.add_development_dependency 'rubocop-rspec', '~> 1.37.1'
28
+ spec.add_development_dependency 'aruba'
29
+ spec.add_development_dependency 'bundler', '~>2.1'
30
+ spec.add_development_dependency 'guard'
31
+ spec.add_development_dependency 'guard-bundler'
32
+ spec.add_development_dependency 'guard-rspec'
33
+ spec.add_development_dependency 'inifile'
34
+ spec.add_development_dependency 'pry'
35
+ spec.add_development_dependency 'pry-byebug'
36
+ spec.add_development_dependency 'rake'
37
+ spec.add_development_dependency 'rspec'
38
+ spec.add_development_dependency 'rubocop'
39
+ spec.add_development_dependency 'rubocop-rake'
40
+ spec.add_development_dependency 'rubocop-rspec'
39
41
  end
40
42
  # rubocop:enable Metrics/BlockLength
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wg-admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steffen Uhlig
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-04-30 00:00:00.000000000 Z
11
+ date: 2021-08-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 1.0.1
19
+ version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 1.0.1
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: aruba
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 0.14.14
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 0.14.14
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -56,142 +56,156 @@ dependencies:
56
56
  name: guard
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 2.16.1
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: 2.16.1
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: guard-bundler
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: 3.0.0
75
+ version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: 3.0.0
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: guard-rspec
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: 4.7.3
89
+ version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - "~>"
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: 4.7.3
96
+ version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: inifile
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - "~>"
101
+ - - ">="
102
102
  - !ruby/object:Gem::Version
103
- version: 3.0.0
103
+ version: '0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - "~>"
108
+ - - ">="
109
109
  - !ruby/object:Gem::Version
110
- version: 3.0.0
110
+ version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: pry
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - "~>"
115
+ - - ">="
116
116
  - !ruby/object:Gem::Version
117
- version: 0.12.2
117
+ version: '0'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - "~>"
122
+ - - ">="
123
123
  - !ruby/object:Gem::Version
124
- version: 0.12.2
124
+ version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: pry-byebug
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - "~>"
129
+ - - ">="
130
130
  - !ruby/object:Gem::Version
131
- version: 3.7.0
131
+ version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - "~>"
136
+ - - ">="
137
137
  - !ruby/object:Gem::Version
138
- version: 3.7.0
138
+ version: '0'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: rake
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - "~>"
143
+ - - ">="
144
144
  - !ruby/object:Gem::Version
145
- version: 13.0.1
145
+ version: '0'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - "~>"
150
+ - - ">="
151
151
  - !ruby/object:Gem::Version
152
- version: 13.0.1
152
+ version: '0'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: rspec
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
- - - "~>"
157
+ - - ">="
158
158
  - !ruby/object:Gem::Version
159
- version: 3.9.0
159
+ version: '0'
160
160
  type: :development
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
- - - "~>"
164
+ - - ">="
165
165
  - !ruby/object:Gem::Version
166
- version: 3.9.0
166
+ version: '0'
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: rubocop
169
169
  requirement: !ruby/object:Gem::Requirement
170
170
  requirements:
171
- - - "~>"
171
+ - - ">="
172
172
  - !ruby/object:Gem::Version
173
- version: 0.79.0
173
+ version: '0'
174
174
  type: :development
175
175
  prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
- - - "~>"
178
+ - - ">="
179
179
  - !ruby/object:Gem::Version
180
- version: 0.79.0
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: rubocop-rake
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
181
195
  - !ruby/object:Gem::Dependency
182
196
  name: rubocop-rspec
183
197
  requirement: !ruby/object:Gem::Requirement
184
198
  requirements:
185
- - - "~>"
199
+ - - ">="
186
200
  - !ruby/object:Gem::Version
187
- version: 1.37.1
201
+ version: '0'
188
202
  type: :development
189
203
  prerelease: false
190
204
  version_requirements: !ruby/object:Gem::Requirement
191
205
  requirements:
192
- - - "~>"
206
+ - - ">="
193
207
  - !ruby/object:Gem::Version
194
- version: 1.37.1
208
+ version: '0'
195
209
  description: wg-admin is an administration tool for WireGuard configuration.
196
210
  email:
197
211
  - steffen@familie-uhlig.net
@@ -200,7 +214,7 @@ executables:
200
214
  extensions: []
201
215
  extra_rdoc_files: []
202
216
  files:
203
- - ".dependabot/config.yml"
217
+ - ".github/dependabot.yml"
204
218
  - ".gitignore"
205
219
  - ".rspec"
206
220
  - ".rubocop.yml"
@@ -231,23 +245,23 @@ homepage: https://github.com/uhlig-it/wg-admin
231
245
  licenses:
232
246
  - MIT
233
247
  metadata: {}
234
- post_install_message:
248
+ post_install_message:
235
249
  rdoc_options: []
236
250
  require_paths:
237
251
  - lib
238
252
  required_ruby_version: !ruby/object:Gem::Requirement
239
253
  requirements:
240
- - - ">="
254
+ - - "~>"
241
255
  - !ruby/object:Gem::Version
242
- version: '0'
256
+ version: '3.0'
243
257
  required_rubygems_version: !ruby/object:Gem::Requirement
244
258
  requirements:
245
259
  - - ">="
246
260
  - !ruby/object:Gem::Version
247
261
  version: '0'
248
262
  requirements: []
249
- rubygems_version: 3.1.2
250
- signing_key:
263
+ rubygems_version: 3.2.22
264
+ signing_key:
251
265
  specification_version: 4
252
266
  summary: WireGuard administration tool
253
267
  test_files: []
@@ -1,16 +0,0 @@
1
- version: 1
2
- update_configs:
3
- - package_manager: "ruby:bundler"
4
- directory: "/"
5
- update_schedule: "live"
6
- automerged_updates:
7
- - match:
8
- dependency_type: "development"
9
- update_type: "all"
10
- - match:
11
- dependency_type: "production"
12
- update_type: "semver:minor"
13
- version_requirement_updates: auto
14
- commit_message:
15
- prefix: "bump"
16
- include_scope: true