1
0
mirror of https://github.com/cmur2/openvpn-status-web.git synced 2024-12-22 22:54:24 +01:00

Add tests and bug fixed parser

This commit is contained in:
cn 2013-05-03 22:23:45 +02:00
parent 457aec64db
commit f2794ccea4
5 changed files with 127 additions and 21 deletions

View File

@ -1,5 +1,6 @@
#!/usr/bin/env ruby #!/usr/bin/env ruby
require 'date'
require 'etc' require 'etc'
require 'logger' require 'logger'
require 'ipaddr' require 'ipaddr'

View File

@ -10,13 +10,32 @@ module OpenVPNStatusWeb
text.lines.each do |line| text.lines.each do |line|
parts = line.strip.split(sep) parts = line.strip.split(sep)
status.client_list << parts[1..5] if parts[0] == "CLIENT_LIST" status.client_list << parse_client(parts[1..5]) if parts[0] == "CLIENT_LIST"
status.routing_table << parts[1..4] if parts[0] == "ROUTING_TABLE" status.routing_table << parse_route(parts[1..4]) if parts[0] == "ROUTING_TABLE"
status.global_stats << parts[1..2] if parts[0] == "GLOBAL_STATS" status.global_stats << parse_global(parts[1..2]) if parts[0] == "GLOBAL_STATS"
end end
status status
end end
private
def self.parse_client(client)
client[2] = client[2].to_i
client[3] = client[3].to_i
client[4] = DateTime.strptime(client[4], '%a %b %d %k:%M:%S %Y')
client
end
def self.parse_route(route)
route[3] = DateTime.strptime(route[3], '%a %b %d %k:%M:%S %Y')
route
end
def self.parse_global(global)
global[1] = global[1].to_i
global
end
end end
end end
end end

View File

@ -15,18 +15,40 @@ module OpenVPNStatusWeb
(current_section = :end; next) if line == "END\n" (current_section = :end; next) if line == "END\n"
case current_section case current_section
when :cl then client_list << line.strip.split(',') when :cl
when :rt then routing_table << line.strip.split(',') client_list << line.strip.split(',')
when :gs then global_stats << line.strip.split(',') when :rt
routing_table << line.strip.split(',')
when :gs
global_stats << line.strip.split(',')
end end
end end
status = Status.new status = Status.new
status.client_list = client_list[2..-1] status.client_list = client_list[2..-1].map { |client| parse_client(client) }
status.routing_table = routing_table[1..-1] status.routing_table = routing_table[1..-1].map { |route| parse_route(route) }
status.global_stats = global_stats status.global_stats = global_stats.map { |global| parse_global(global) }
status status
end end
private
def parse_client(client)
client[2] = client[2].to_i
client[3] = client[3].to_i
client[4] = DateTime.strptime(client[4], '%a %b %d %k:%M:%S %Y')
client
end
def parse_route(route)
route[3] = DateTime.strptime(route[3], '%a %b %d %k:%M:%S %Y')
route
end
def parse_global(global)
global[1] = global[1].to_i
global
end
end end
end end
end end

View File

@ -6,17 +6,49 @@ describe OpenVPNStatusWeb::Parser::ModernStateless do
3 => status_v3 3 => status_v3
}.each do |version, status| }.each do |version, status|
context "for status-version #{version}" do context "for status-version #{version}" do
it 'parses client list' do context 'for client list' do
status.client_list.map { |client| client[0] }.should be_eql ["foo", "bar"] it 'parses common names' do
status.client_list.map { |client| client[0] }.should be == ["foo", "bar"]
end end
it 'parses routing table' do it 'parses real addresses' do
status.routing_table.map { |route| route[1] }.should be_eql ["foo", "bar", "foo", "bar"] status.client_list.map { |client| client[1] }.should be == ["1.2.3.4:1234", "1.2.3.5:1235"]
end
it 'parses received bytes' do
status.client_list.map { |client| client[2] }.should be == [11811160064, 512]
end
it 'parses sent bytes' do
status.client_list.map { |client| client[3] }.should be == [4194304, 2048]
end
it 'parses connected since date' do
status.client_list.map { |client| client[4] }.should be == [DateTime.new(2012,1,1,23,42,0), DateTime.new(2012,1,1,23,42,0)]
end
end
context 'for routing table' do
it 'parses virtual addresses' do
status.routing_table.map { |route| route[0] }.should be == ["192.168.0.0/24", "192.168.66.2", "192.168.66.3", "2001:db8:0:0::1000"]
end
it 'parses common names' do
status.routing_table.map { |route| route[1] }.should be == ["foo", "bar", "foo", "bar"]
end
it 'parses real addresses' do
status.routing_table.map { |route| route[2] }.should be == ["1.2.3.4:1234", "1.2.3.5:1235", "1.2.3.4:1234", "1.2.3.5:1235"]
end
it 'parses last ref date' do
status.routing_table.map { |route| route[3] }.should be == [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)]
end
end end
it 'parses global stats' do it 'parses global stats' do
status.global_stats.size.should be_eql 1 status.global_stats.size.should be == 1
status.global_stats.first.should be_eql ["Max bcast/mcast queue length", "42"] status.global_stats.first.should be == ["Max bcast/mcast queue length", 42]
end end
end end
end end

View File

@ -3,16 +3,48 @@ require 'spec_helper'
describe OpenVPNStatusWeb::Parser::V1 do describe OpenVPNStatusWeb::Parser::V1 do
def status; status_v1; end def status; status_v1; end
it 'parses client list' do context 'for client list' do
status.client_list.map { |client| client[0] }.should be_eql ["foo", "bar"] it 'parses common names' do
status.client_list.map { |client| client[0] }.should be == ["foo", "bar"]
end end
it 'parses routing table' do it 'parses real addresses' do
status.routing_table.map { |route| route[1] }.should be_eql ["foo", "bar", "foo", "bar"] status.client_list.map { |client| client[1] }.should be == ["1.2.3.4:1234", "1.2.3.5:1235"]
end
it 'parses received bytes' do
status.client_list.map { |client| client[2] }.should be == [11811160064, 512]
end
it 'parses sent bytes' do
status.client_list.map { |client| client[3] }.should be == [4194304, 2048]
end
it 'parses connected since date' do
status.client_list.map { |client| client[4] }.should be == [DateTime.new(2012,1,1,23,42,0), DateTime.new(2012,1,1,23,42,0)]
end
end
context 'for routing table' do
it 'parses virtual addresses' do
status.routing_table.map { |route| route[0] }.should be == ["192.168.0.0/24", "192.168.66.2", "192.168.66.3", "2001:db8:0:0::1000"]
end
it 'parses common names' do
status.routing_table.map { |route| route[1] }.should be == ["foo", "bar", "foo", "bar"]
end
it 'parses real addresses' do
status.routing_table.map { |route| route[2] }.should be == ["1.2.3.4:1234", "1.2.3.5:1235", "1.2.3.4:1234", "1.2.3.5:1235"]
end
it 'parses last ref date' do
status.routing_table.map { |route| route[3] }.should be == [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)]
end
end end
it 'parses global stats' do it 'parses global stats' do
status.global_stats.size.should be_eql 1 status.global_stats.size.should be == 1
status.global_stats.first.should be_eql ["Max bcast/mcast queue length", "42"] status.global_stats.first.should be == ["Max bcast/mcast queue length", 42]
end end
end end