openvpn-status-web 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/{bin → exe}/openvpn-status-web +2 -0
- data/lib/openvpn-status-web.rb +44 -27
- data/lib/openvpn-status-web/int_patch.rb +8 -7
- data/lib/openvpn-status-web/parser/modern_stateless.rb +7 -8
- data/lib/openvpn-status-web/parser/v1.rb +2 -1
- data/lib/openvpn-status-web/parser/v2.rb +2 -1
- data/lib/openvpn-status-web/parser/v3.rb +2 -1
- data/lib/openvpn-status-web/status.rb +1 -0
- data/lib/openvpn-status-web/version.rb +2 -1
- metadata +64 -33
- data/.gitignore +0 -3
- data/.travis.yml +0 -7
- data/Gemfile +0 -3
- data/Rakefile +0 -6
- data/examples/status.v1 +0 -14
- data/examples/status.v2 +0 -12
- data/examples/status.v3 +0 -12
- data/openvpn-status-web.gemspec +0 -32
- data/spec/parser/modern_stateless_spec.rb +0 -55
- data/spec/parser/v1_spec.rb +0 -50
- data/spec/spec_helper.rb +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: de8d358e0600c1f0843ff7bccc59bcc4a9ad685b70856509118d8ad6791bb870
|
4
|
+
data.tar.gz: d38bbd5238e321bdf5814a6c2e998f706e35897fa49f88180cdd4197852c1a42
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e4ce6ce068a55fe4ea2f9ee1815719033458307a476c9106c56fe22bcc65933d32e1b1c34ad42aa0981b6765a63a0842a2953d365554d044bb01734b3a9f04e9
|
7
|
+
data.tar.gz: b64467e939fde4ea6130d5f868351f9772da39440f1016c65adcaefd90904ba950d5ec16fa235f6343ebdf88260619b73785a4a0b037dcb49abd61c1f4078301
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# openvpn-status-web
|
2
2
|
|
3
|
-
[](https://travis-ci.org/cmur2/openvpn-status-web) [](https://depfu.com/github/cmur2/openvpn-status-web?project_id=6194)
|
4
4
|
|
5
5
|
## Description
|
6
6
|
|
data/lib/openvpn-status-web.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require 'date'
|
4
5
|
require 'etc'
|
@@ -8,7 +9,7 @@ require 'yaml'
|
|
8
9
|
require 'rack'
|
9
10
|
require 'erb'
|
10
11
|
require 'metriks'
|
11
|
-
require 'better_errors' if ENV['RACK_ENV'] ==
|
12
|
+
require 'better_errors' if ENV['RACK_ENV'] == 'development'
|
12
13
|
|
13
14
|
require 'openvpn-status-web/status'
|
14
15
|
require 'openvpn-status-web/parser/v1'
|
@@ -18,17 +19,25 @@ require 'openvpn-status-web/int_patch'
|
|
18
19
|
require 'openvpn-status-web/version'
|
19
20
|
|
20
21
|
module OpenVPNStatusWeb
|
22
|
+
# @return [Logger]
|
21
23
|
def self.logger
|
22
24
|
@logger
|
23
25
|
end
|
24
26
|
|
27
|
+
# @param logger [Logger]
|
28
|
+
# @return [Logger]
|
25
29
|
def self.logger=(logger)
|
26
30
|
@logger = logger
|
27
31
|
end
|
28
32
|
|
29
33
|
class LogFormatter
|
30
|
-
|
31
|
-
|
34
|
+
# @param lvl [Object]
|
35
|
+
# @param _time [DateTime]
|
36
|
+
# @param _progname [String]
|
37
|
+
# @param msg [Object]
|
38
|
+
# @return [String]
|
39
|
+
def call(lvl, _time, _progname, msg)
|
40
|
+
format("[%s] %-5s %s\n", Time.now.strftime('%Y-%m-%d %H:%M:%S'), lvl, msg.to_s)
|
32
41
|
end
|
33
42
|
end
|
34
43
|
|
@@ -40,29 +49,29 @@ module OpenVPNStatusWeb
|
|
40
49
|
end
|
41
50
|
|
42
51
|
def call(env)
|
43
|
-
return [405, {
|
44
|
-
return [404, {
|
52
|
+
return [405, {'Content-Type' => 'text/plain'}, ['Method Not Allowed']] if env['REQUEST_METHOD'] != 'GET'
|
53
|
+
return [404, {'Content-Type' => 'text/plain'}, ['Not Found']] if env['PATH_INFO'] != '/'
|
45
54
|
|
46
55
|
# variables for template
|
47
56
|
vpns = @vpns
|
48
57
|
stati = {}
|
49
|
-
@vpns.each do |name,config|
|
58
|
+
@vpns.each do |name, config|
|
50
59
|
stati[name] = parse_status_log(config)
|
51
60
|
end
|
52
61
|
# eval
|
53
62
|
html = @main_tmpl.result(binding)
|
54
63
|
|
55
|
-
[200, {
|
64
|
+
[200, {'Content-Type' => 'text/html'}, [html]]
|
56
65
|
end
|
57
66
|
|
58
67
|
def read_template(file)
|
59
|
-
text = File.
|
60
|
-
|
68
|
+
text = File.read(file, mode: 'rb')
|
69
|
+
|
61
70
|
ERB.new(text)
|
62
71
|
end
|
63
|
-
|
72
|
+
|
64
73
|
def parse_status_log(vpn)
|
65
|
-
text = File.
|
74
|
+
text = File.read(vpn['status_file'], mode: 'rb')
|
66
75
|
|
67
76
|
case vpn['version']
|
68
77
|
when 1
|
@@ -76,23 +85,24 @@ module OpenVPNStatusWeb
|
|
76
85
|
end
|
77
86
|
end
|
78
87
|
|
88
|
+
# @return [void]
|
79
89
|
def self.run!
|
80
90
|
if ARGV.length != 1
|
81
|
-
puts
|
91
|
+
puts 'Usage: openvpn-status-web config_file'
|
82
92
|
exit 1
|
83
93
|
end
|
84
94
|
|
85
95
|
config_file = ARGV[0]
|
86
96
|
|
87
|
-
if
|
88
|
-
puts
|
97
|
+
if !File.file?(config_file)
|
98
|
+
puts 'Config file not found!'
|
89
99
|
exit 1
|
90
100
|
end
|
91
|
-
|
101
|
+
|
92
102
|
puts "openvpn-status-web version #{OpenVPNStatusWeb::VERSION}"
|
93
103
|
puts "Using config file #{config_file}"
|
94
104
|
|
95
|
-
config = YAML
|
105
|
+
config = YAML.safe_load(File.read(config_file, mode: 'r'))
|
96
106
|
|
97
107
|
if config['logfile']
|
98
108
|
OpenVPNStatusWeb.logger = Logger.new(config['logfile'])
|
@@ -100,32 +110,39 @@ module OpenVPNStatusWeb
|
|
100
110
|
OpenVPNStatusWeb.logger = Logger.new(STDOUT)
|
101
111
|
end
|
102
112
|
|
103
|
-
OpenVPNStatusWeb.logger.progname =
|
113
|
+
OpenVPNStatusWeb.logger.progname = 'openvpn-status-web'
|
104
114
|
OpenVPNStatusWeb.logger.formatter = LogFormatter.new
|
105
115
|
|
106
|
-
OpenVPNStatusWeb.logger.info
|
116
|
+
OpenVPNStatusWeb.logger.info 'Starting...'
|
107
117
|
|
108
|
-
# drop
|
109
|
-
|
110
|
-
|
118
|
+
# drop priviliges as soon as possible
|
119
|
+
# NOTE: first change group than user
|
120
|
+
if config['group']
|
121
|
+
group = Etc.getgrnam(config['group'])
|
122
|
+
Process::Sys.setgid(group.gid) if group
|
123
|
+
end
|
124
|
+
if config['user']
|
125
|
+
user = Etc.getpwnam(config['user'])
|
126
|
+
Process::Sys.setuid(user.uid) if user
|
127
|
+
end
|
111
128
|
|
112
129
|
# configure rack
|
113
130
|
app = Daemon.new(config['vpns'])
|
114
|
-
if ENV['RACK_ENV'] ==
|
131
|
+
if ENV['RACK_ENV'] == 'development'
|
115
132
|
app = BetterErrors::Middleware.new(app)
|
116
|
-
BetterErrors.application_root = File.expand_path(
|
133
|
+
BetterErrors.application_root = File.expand_path(__dir__)
|
117
134
|
end
|
118
135
|
|
119
136
|
Signal.trap('INT') do
|
120
|
-
OpenVPNStatusWeb.logger.info
|
137
|
+
OpenVPNStatusWeb.logger.info 'Quitting...'
|
121
138
|
Rack::Handler::WEBrick.shutdown
|
122
139
|
end
|
123
140
|
Signal.trap('TERM') do
|
124
|
-
OpenVPNStatusWeb.logger.info
|
141
|
+
OpenVPNStatusWeb.logger.info 'Quitting...'
|
125
142
|
Rack::Handler::WEBrick.shutdown
|
126
143
|
end
|
127
|
-
|
128
|
-
Rack::Handler::WEBrick.run app, :
|
144
|
+
|
145
|
+
Rack::Handler::WEBrick.run app, Host: config['host'], Port: config['port']
|
129
146
|
end
|
130
147
|
end
|
131
148
|
end
|
@@ -1,16 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
3
|
class Integer
|
3
4
|
def as_bytes
|
4
|
-
return
|
5
|
-
|
6
|
-
label = [
|
5
|
+
return '1 Byte' if self == 1
|
6
|
+
|
7
|
+
label = %w[Bytes KiB MiB GiB TiB]
|
7
8
|
i = 0
|
8
|
-
num =
|
9
|
-
while num >= 1024
|
10
|
-
num
|
9
|
+
num = to_f
|
10
|
+
while num >= 1024
|
11
|
+
num /= 1024
|
11
12
|
i += 1
|
12
13
|
end
|
13
|
-
|
14
|
+
|
14
15
|
"#{format('%.2f', num)} #{label[i]}"
|
15
16
|
end
|
16
17
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
3
|
module OpenVPNStatusWeb
|
3
4
|
module Parser
|
@@ -10,29 +11,27 @@ module OpenVPNStatusWeb
|
|
10
11
|
|
11
12
|
text.lines.each do |line|
|
12
13
|
parts = line.strip.split(sep)
|
13
|
-
status.client_list << parse_client(parts[1..5]) if parts[0] ==
|
14
|
-
status.routing_table << parse_route(parts[1..4]) if parts[0] ==
|
15
|
-
status.global_stats << parse_global(parts[1..2]) if parts[0] ==
|
14
|
+
status.client_list << parse_client(parts[1..5]) if parts[0] == 'CLIENT_LIST'
|
15
|
+
status.routing_table << parse_route(parts[1..4]) if parts[0] == 'ROUTING_TABLE'
|
16
|
+
status.global_stats << parse_global(parts[1..2]) if parts[0] == 'GLOBAL_STATS'
|
16
17
|
end
|
17
18
|
|
18
19
|
status
|
19
20
|
end
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
def self.parse_client(client)
|
22
|
+
private_class_method def self.parse_client(client)
|
24
23
|
client[2] = client[2].to_i
|
25
24
|
client[3] = client[3].to_i
|
26
25
|
client[4] = DateTime.strptime(client[4], '%a %b %d %k:%M:%S %Y')
|
27
26
|
client
|
28
27
|
end
|
29
28
|
|
30
|
-
def self.parse_route(route)
|
29
|
+
private_class_method def self.parse_route(route)
|
31
30
|
route[3] = DateTime.strptime(route[3], '%a %b %d %k:%M:%S %Y')
|
32
31
|
route
|
33
32
|
end
|
34
33
|
|
35
|
-
def self.parse_global(global)
|
34
|
+
private_class_method def self.parse_global(global)
|
36
35
|
global[1] = global[1].to_i
|
37
36
|
global
|
38
37
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
3
|
module OpenVPNStatusWeb
|
3
4
|
module Parser
|
@@ -13,7 +14,7 @@ module OpenVPNStatusWeb
|
|
13
14
|
(current_section = :rt; next) if line == "ROUTING TABLE\n"
|
14
15
|
(current_section = :gs; next) if line == "GLOBAL STATS\n"
|
15
16
|
(current_section = :end; next) if line == "END\n"
|
16
|
-
|
17
|
+
|
17
18
|
case current_section
|
18
19
|
when :cl
|
19
20
|
client_list << line.strip.split(',')
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: openvpn-status-web
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christian Nicolai
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: metriks
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: rack
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -25,13 +39,13 @@ dependencies:
|
|
25
39
|
- !ruby/object:Gem::Version
|
26
40
|
version: '2.0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
42
|
+
name: better_errors
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
45
|
- - ">="
|
32
46
|
- !ruby/object:Gem::Version
|
33
47
|
version: '0'
|
34
|
-
type: :
|
48
|
+
type: :development
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
@@ -39,7 +53,7 @@ dependencies:
|
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
56
|
+
name: binding_of_caller
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
59
|
- - ">="
|
@@ -53,7 +67,7 @@ dependencies:
|
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
70
|
+
name: bundler
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
73
|
- - ">="
|
@@ -67,7 +81,21 @@ dependencies:
|
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
84
|
+
name: bundler-audit
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.6.0
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.6.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rack-test
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
72
100
|
requirements:
|
73
101
|
- - ">="
|
@@ -81,7 +109,7 @@ dependencies:
|
|
81
109
|
- !ruby/object:Gem::Version
|
82
110
|
version: '0'
|
83
111
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
112
|
+
name: rake
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
86
114
|
requirements:
|
87
115
|
- - ">="
|
@@ -95,7 +123,7 @@ dependencies:
|
|
95
123
|
- !ruby/object:Gem::Version
|
96
124
|
version: '0'
|
97
125
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
126
|
+
name: rspec
|
99
127
|
requirement: !ruby/object:Gem::Requirement
|
100
128
|
requirements:
|
101
129
|
- - ">="
|
@@ -109,7 +137,21 @@ dependencies:
|
|
109
137
|
- !ruby/object:Gem::Version
|
110
138
|
version: '0'
|
111
139
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
140
|
+
name: rubocop
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 0.80.0
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 0.80.0
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: solargraph
|
113
155
|
requirement: !ruby/object:Gem::Requirement
|
114
156
|
requirements:
|
115
157
|
- - ">="
|
@@ -123,22 +165,17 @@ dependencies:
|
|
123
165
|
- !ruby/object:Gem::Version
|
124
166
|
version: '0'
|
125
167
|
description: Small Rack (Ruby) application serving OpenVPN status file.
|
126
|
-
email:
|
168
|
+
email:
|
127
169
|
executables:
|
128
170
|
- openvpn-status-web
|
129
171
|
extensions: []
|
130
|
-
extra_rdoc_files:
|
172
|
+
extra_rdoc_files:
|
173
|
+
- README.md
|
174
|
+
- LICENSE
|
131
175
|
files:
|
132
|
-
- ".gitignore"
|
133
|
-
- ".travis.yml"
|
134
|
-
- Gemfile
|
135
176
|
- LICENSE
|
136
177
|
- README.md
|
137
|
-
-
|
138
|
-
- bin/openvpn-status-web
|
139
|
-
- examples/status.v1
|
140
|
-
- examples/status.v2
|
141
|
-
- examples/status.v3
|
178
|
+
- exe/openvpn-status-web
|
142
179
|
- init.d/debian-6-openvpn-status-web
|
143
180
|
- lib/openvpn-status-web.rb
|
144
181
|
- lib/openvpn-status-web/int_patch.rb
|
@@ -149,14 +186,12 @@ files:
|
|
149
186
|
- lib/openvpn-status-web/parser/v3.rb
|
150
187
|
- lib/openvpn-status-web/status.rb
|
151
188
|
- lib/openvpn-status-web/version.rb
|
152
|
-
|
153
|
-
- spec/parser/modern_stateless_spec.rb
|
154
|
-
- spec/parser/v1_spec.rb
|
155
|
-
- spec/spec_helper.rb
|
156
|
-
homepage: https://github.com/cmur2/dyndnsd
|
189
|
+
homepage: https://github.com/cmur2/openvpn-status-web
|
157
190
|
licenses:
|
158
191
|
- Apache-2.0
|
159
|
-
metadata:
|
192
|
+
metadata:
|
193
|
+
bug_tracker_uri: https://github.com/cmur2/openvpn-status-web/issues
|
194
|
+
source_code_uri: https://github.com/cmur2/openvpn-status-web
|
160
195
|
post_install_message:
|
161
196
|
rdoc_options: []
|
162
197
|
require_paths:
|
@@ -172,12 +207,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
172
207
|
- !ruby/object:Gem::Version
|
173
208
|
version: '0'
|
174
209
|
requirements: []
|
175
|
-
|
176
|
-
rubygems_version: 2.7.7
|
210
|
+
rubygems_version: 3.0.6
|
177
211
|
signing_key:
|
178
212
|
specification_version: 4
|
179
213
|
summary: openvpn-status-web
|
180
|
-
test_files:
|
181
|
-
- spec/parser/modern_stateless_spec.rb
|
182
|
-
- spec/parser/v1_spec.rb
|
183
|
-
- spec/spec_helper.rb
|
214
|
+
test_files: []
|
data/.gitignore
DELETED
data/.travis.yml
DELETED
data/Gemfile
DELETED
data/Rakefile
DELETED
data/examples/status.v1
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
OpenVPN CLIENT LIST
|
2
|
-
Updated,Sun Jan 1 23:42:00 2012
|
3
|
-
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
|
4
|
-
foo,1.2.3.4:1234,11811160064,4194304,Sun Jan 1 23:42:00 2012
|
5
|
-
bar,1.2.3.5:1235,512,2048,Sun Jan 1 23:42:00 2012
|
6
|
-
ROUTING TABLE
|
7
|
-
Virtual Address,Common Name,Real Address,Last Ref
|
8
|
-
192.168.0.0/24,foo,1.2.3.4:1234,Sun Jan 1 23:42:00 2012
|
9
|
-
192.168.66.2,bar,1.2.3.5:1235,Sun Jan 1 23:42:00 2012
|
10
|
-
192.168.66.3,foo,1.2.3.4:1234,Sun Jan 1 23:42:00 2012
|
11
|
-
2001:db8:0:0::1000,bar,1.2.3.5:1235,Sun Jan 1 23:42:00 2012
|
12
|
-
GLOBAL STATS
|
13
|
-
Max bcast/mcast queue length,42
|
14
|
-
END
|
data/examples/status.v2
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
TITLE,OpenVPN 2.1_rc15 mipsel-unknown-linux-gnu [SSL] [LZO1] [EPOLL] built on Mar 27 2009
|
2
|
-
TIME,Sun Jan 1 23:42:00 2012,1238702330
|
3
|
-
HEADER,CLIENT_LIST,Common Name,Real Address,Virtual Address,Bytes Received,Bytes Sent,Connected Since,Connected Since (time_t)
|
4
|
-
CLIENT_LIST,foo,1.2.3.4:1234,11811160064,4194304,Sun Jan 1 23:42:00 2012,1238702330
|
5
|
-
CLIENT_LIST,bar,1.2.3.5:1235,512,2048,Sun Jan 1 23:42:00 2012,1238702330
|
6
|
-
HEADER,ROUTING_TABLE,Virtual Address,Common Name,Real Address,Last Ref,Last Ref (time_t)
|
7
|
-
ROUTING_TABLE,192.168.0.0/24,foo,1.2.3.4:1234,Sun Jan 1 23:42:00 2012,1238702330
|
8
|
-
ROUTING_TABLE,192.168.66.2,bar,1.2.3.5:1235,Sun Jan 1 23:42:00 2012,1238702330
|
9
|
-
ROUTING_TABLE,192.168.66.3,foo,1.2.3.4:1234,Sun Jan 1 23:42:00 2012,1238702330
|
10
|
-
ROUTING_TABLE,2001:db8:0:0::1000,bar,1.2.3.5:1235,Sun Jan 1 23:42:00 2012,1238702330
|
11
|
-
GLOBAL_STATS,Max bcast/mcast queue length,42
|
12
|
-
END
|
data/examples/status.v3
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
TITLE OpenVPN 2.1_rc15 mipsel-unknown-linux-gnu [SSL] [LZO1] [EPOLL] built on Mar 27 2009
|
2
|
-
TIME Sun Jan 1 23:42:00 2012 1238702330
|
3
|
-
HEADER CLIENT_LIST Common Name Real Address Virtual Address Bytes Received Bytes Sent Connected Since Connected Since (time_t)
|
4
|
-
CLIENT_LIST foo 1.2.3.4:1234 11811160064 4194304 Sun Jan 1 23:42:00 2012 1238702330
|
5
|
-
CLIENT_LIST bar 1.2.3.5:1235 512 2048 Sun Jan 1 23:42:00 2012 1238702330
|
6
|
-
HEADER ROUTING_TABLE Virtual Address Common Name Real Address Last Ref Last Ref (time_t)
|
7
|
-
ROUTING_TABLE 192.168.0.0/24 foo 1.2.3.4:1234 Sun Jan 1 23:42:00 2012 1238702330
|
8
|
-
ROUTING_TABLE 192.168.66.2 bar 1.2.3.5:1235 Sun Jan 1 23:42:00 2012 1238702330
|
9
|
-
ROUTING_TABLE 192.168.66.3 foo 1.2.3.4:1234 Sun Jan 1 23:42:00 2012 1238702330
|
10
|
-
ROUTING_TABLE 2001:db8:0:0::1000 bar 1.2.3.5:1235 Sun Jan 1 23:42:00 2012 1238702330
|
11
|
-
GLOBAL_STATS Max bcast/mcast queue length 42
|
12
|
-
END
|
data/openvpn-status-web.gemspec
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
|
2
|
-
$LOAD_PATH.push File.expand_path('lib', __dir__)
|
3
|
-
|
4
|
-
require 'openvpn-status-web/version'
|
5
|
-
|
6
|
-
Gem::Specification.new do |s|
|
7
|
-
s.name = 'openvpn-status-web'
|
8
|
-
s.version = OpenVPNStatusWeb::VERSION
|
9
|
-
s.summary = 'openvpn-status-web'
|
10
|
-
s.description = 'Small Rack (Ruby) application serving OpenVPN status file.'
|
11
|
-
s.author = 'Christian Nicolai'
|
12
|
-
s.email = 'chrnicolai@gmail.com'
|
13
|
-
s.homepage = 'https://github.com/cmur2/dyndnsd'
|
14
|
-
s.license = 'Apache-2.0'
|
15
|
-
|
16
|
-
s.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
17
|
-
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
18
|
-
s.require_paths = ['lib']
|
19
|
-
s.executables = ['openvpn-status-web']
|
20
|
-
|
21
|
-
s.required_ruby_version = '>= 2.3'
|
22
|
-
|
23
|
-
s.add_runtime_dependency 'rack', '~> 2.0'
|
24
|
-
s.add_runtime_dependency 'metriks'
|
25
|
-
|
26
|
-
s.add_development_dependency 'bundler'
|
27
|
-
s.add_development_dependency 'rake'
|
28
|
-
s.add_development_dependency 'rspec'
|
29
|
-
s.add_development_dependency 'rack-test'
|
30
|
-
s.add_development_dependency 'better_errors'
|
31
|
-
s.add_development_dependency 'binding_of_caller'
|
32
|
-
end
|
@@ -1,55 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe OpenVPNStatusWeb::Parser::ModernStateless do
|
4
|
-
{
|
5
|
-
2 => status_v2,
|
6
|
-
3 => status_v3
|
7
|
-
}.each do |version, status|
|
8
|
-
context "for status-version #{version}" do
|
9
|
-
context 'for client list' do
|
10
|
-
it 'parses common names' do
|
11
|
-
expect(status.client_list.map { |client| client[0] }).to eq(["foo", "bar"])
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'parses real addresses' do
|
15
|
-
expect(status.client_list.map { |client| client[1] }).to eq(["1.2.3.4:1234", "1.2.3.5:1235"])
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'parses received bytes' do
|
19
|
-
expect(status.client_list.map { |client| client[2] }).to eq([11811160064, 512])
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'parses sent bytes' do
|
23
|
-
expect(status.client_list.map { |client| client[3] }).to eq([4194304, 2048])
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'parses connected since date' do
|
27
|
-
expect(status.client_list.map { |client| client[4] }).to eq([DateTime.new(2012,1,1,23,42,0), DateTime.new(2012,1,1,23,42,0)])
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
context 'for routing table' do
|
32
|
-
it 'parses virtual addresses' do
|
33
|
-
expect(status.routing_table.map { |route| route[0] }).to eq(["192.168.0.0/24", "192.168.66.2", "192.168.66.3", "2001:db8:0:0::1000"])
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'parses common names' do
|
37
|
-
expect(status.routing_table.map { |route| route[1] }).to eq(["foo", "bar", "foo", "bar"])
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'parses real addresses' do
|
41
|
-
expect(status.routing_table.map { |route| route[2] }).to eq(["1.2.3.4:1234", "1.2.3.5:1235", "1.2.3.4:1234", "1.2.3.5:1235"])
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'parses last ref date' do
|
45
|
-
expect(status.routing_table.map { |route| route[3] }).to eq([DateTime.new(2012,1,1,23,42,0), DateTime.new(2012,1,1,23,42,0), DateTime.new(2012,1,1,23,42,0), DateTime.new(2012,1,1,23,42,0)])
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'parses global stats' do
|
50
|
-
expect(status.global_stats.size).to eq(1)
|
51
|
-
expect(status.global_stats.first).to eq(["Max bcast/mcast queue length", 42])
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
data/spec/parser/v1_spec.rb
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe OpenVPNStatusWeb::Parser::V1 do
|
4
|
-
def status; status_v1; end
|
5
|
-
|
6
|
-
context 'for client list' do
|
7
|
-
it 'parses common names' do
|
8
|
-
expect(status.client_list.map { |client| client[0] }).to eq(["foo", "bar"])
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'parses real addresses' do
|
12
|
-
expect(status.client_list.map { |client| client[1] }).to eq(["1.2.3.4:1234", "1.2.3.5:1235"])
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'parses received bytes' do
|
16
|
-
expect(status.client_list.map { |client| client[2] }).to eq([11811160064, 512])
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'parses sent bytes' do
|
20
|
-
expect(status.client_list.map { |client| client[3] }).to eq([4194304, 2048])
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'parses connected since date' do
|
24
|
-
expect(status.client_list.map { |client| client[4] }).to eq([DateTime.new(2012,1,1,23,42,0), DateTime.new(2012,1,1,23,42,0)])
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
context 'for routing table' do
|
29
|
-
it 'parses virtual addresses' do
|
30
|
-
expect(status.routing_table.map { |route| route[0] }).to eq(["192.168.0.0/24", "192.168.66.2", "192.168.66.3", "2001:db8:0:0::1000"])
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'parses common names' do
|
34
|
-
expect(status.routing_table.map { |route| route[1] }).to eq(["foo", "bar", "foo", "bar"])
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'parses real addresses' do
|
38
|
-
expect(status.routing_table.map { |route| route[2] }).to eq(["1.2.3.4:1234", "1.2.3.5:1235", "1.2.3.4:1234", "1.2.3.5:1235"])
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'parses last ref date' do
|
42
|
-
expect(status.routing_table.map { |route| route[3] }).to eq([DateTime.new(2012,1,1,23,42,0), DateTime.new(2012,1,1,23,42,0), DateTime.new(2012,1,1,23,42,0), DateTime.new(2012,1,1,23,42,0)])
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'parses global stats' do
|
47
|
-
expect(status.global_stats.size).to eq(1)
|
48
|
-
expect(status.global_stats.first).to eq(["Max bcast/mcast queue length", 42])
|
49
|
-
end
|
50
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'rubygems'
|
3
|
-
require 'bundler/setup'
|
4
|
-
require 'rack/test'
|
5
|
-
|
6
|
-
require 'openvpn-status-web'
|
7
|
-
|
8
|
-
def status_v1
|
9
|
-
text = File.open('examples/status.v1', 'rb') do |f| f.read end
|
10
|
-
OpenVPNStatusWeb::Parser::V1.new.parse_status_log text
|
11
|
-
end
|
12
|
-
|
13
|
-
def status_v2
|
14
|
-
text = File.open('examples/status.v2', 'rb') do |f| f.read end
|
15
|
-
OpenVPNStatusWeb::Parser::V2.new.parse_status_log text
|
16
|
-
end
|
17
|
-
|
18
|
-
def status_v3
|
19
|
-
text = File.open('examples/status.v3', 'rb') do |f| f.read end
|
20
|
-
OpenVPNStatusWeb::Parser::V3.new.parse_status_log text
|
21
|
-
end
|