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

gem: add rubocop and fix style

This commit is contained in:
cn 2020-03-02 01:57:58 +01:00
parent d959e7fe62
commit 140c60c753
11 changed files with 175 additions and 67 deletions

87
.rubocop.yml Normal file
View File

@ -0,0 +1,87 @@
AllCops:
TargetRubyVersion: '2.3'
Layout/EmptyLineAfterGuardClause:
Enabled: false
# allows nicer usage of private_class_method
Layout/EmptyLinesAroundArguments:
Enabled: false
Layout/HashAlignment:
Enabled: false
Layout/LeadingEmptyLines:
Enabled: false
Layout/LineLength:
Max: 200
Layout/SpaceInsideHashLiteralBraces:
Enabled: false
Metrics/AbcSize:
Enabled: false
Metrics/BlockLength:
Enabled: false
Metrics/ClassLength:
Enabled: false
Metrics/CyclomaticComplexity:
Enabled: false
Metrics/MethodLength:
Enabled: false
Metrics/PerceivedComplexity:
Enabled: false
Naming/MethodParameterName:
Enabled: false
Naming/MemoizedInstanceVariableName:
Enabled: false
Style/ConditionalAssignment:
Enabled: false
Style/Documentation:
Enabled: false
Style/FormatStringToken:
Enabled: false
Style/FrozenStringLiteralComment:
Enabled: false
Style/GuardClause:
Enabled: false
Style/HashEachMethods:
Enabled: true
Style/HashTransformKeys:
Enabled: true
Style/HashTransformValues:
Enabled: true
Style/IdenticalConditionalBranches:
Enabled: false
Style/InverseMethods:
Enabled: false
Style/NegatedIf:
Enabled: false
Style/RescueModifier:
Enabled: false
Style/Semicolon:
AllowAsExpressionSeparator: true
Style/SymbolArray:
Enabled: false

View File

@ -1,8 +1,10 @@
require 'bundler/gem_tasks' require 'bundler/gem_tasks'
require 'rspec/core/rake_task' require 'rspec/core/rake_task'
require 'rubocop/rake_task'
require 'bundler/audit/task' require 'bundler/audit/task'
RSpec::Core::RakeTask.new(:spec) RSpec::Core::RakeTask.new(:spec)
RuboCop::RakeTask.new
Bundler::Audit::Task.new Bundler::Audit::Task.new
desc 'Should be run by developer once to prepare initial solargraph usage (fill caches etc.)' desc 'Should be run by developer once to prepare initial solargraph usage (fill caches etc.)'
@ -15,6 +17,6 @@ task :'solargraph:tc' do
sh 'solargraph typecheck' sh 'solargraph typecheck'
end end
task :default => [:spec, 'bundle:audit'] task default: [:rubocop, :spec, 'bundle:audit']
task travis: [:default, :'solargraph:tc'] task travis: [:default, :'solargraph:tc']

48
lib/openvpn-status-web.rb Normal file → Executable file
View File

@ -8,7 +8,7 @@ require 'yaml'
require 'rack' require 'rack'
require 'erb' require 'erb'
require 'metriks' require 'metriks'
require 'better_errors' if ENV['RACK_ENV'] == "development" require 'better_errors' if ENV['RACK_ENV'] == 'development'
require 'openvpn-status-web/status' require 'openvpn-status-web/status'
require 'openvpn-status-web/parser/v1' require 'openvpn-status-web/parser/v1'
@ -27,8 +27,8 @@ module OpenVPNStatusWeb
end end
class LogFormatter class LogFormatter
def call(lvl, time, progname, msg) def call(lvl, _time, _progname, msg)
"[%s] %-5s %s\n" % [Time.now.strftime('%Y-%m-%d %H:%M:%S'), lvl, msg.to_s] format("[%s] %-5s %s\n", Time.now.strftime('%Y-%m-%d %H:%M:%S'), lvl, msg.to_s)
end end
end end
@ -40,29 +40,29 @@ module OpenVPNStatusWeb
end end
def call(env) def call(env)
return [405, {"Content-Type" => "text/plain"}, ["Method Not Allowed"]] if env["REQUEST_METHOD"] != "GET" return [405, {'Content-Type' => 'text/plain'}, ['Method Not Allowed']] if env['REQUEST_METHOD'] != 'GET'
return [404, {"Content-Type" => "text/plain"}, ["Not Found"]] if env["PATH_INFO"] != "/" return [404, {'Content-Type' => 'text/plain'}, ['Not Found']] if env['PATH_INFO'] != '/'
# variables for template # variables for template
vpns = @vpns vpns = @vpns
stati = {} stati = {}
@vpns.each do |name,config| @vpns.each do |name, config|
stati[name] = parse_status_log(config) stati[name] = parse_status_log(config)
end end
# eval # eval
html = @main_tmpl.result(binding) html = @main_tmpl.result(binding)
[200, {"Content-Type" => "text/html"}, [html]] [200, {'Content-Type' => 'text/html'}, [html]]
end end
def read_template(file) def read_template(file)
text = File.open(file, 'rb') do |f| f.read end text = File.open(file, 'rb', &:read)
ERB.new(text) ERB.new(text)
end end
def parse_status_log(vpn) def parse_status_log(vpn)
text = File.open(vpn['status_file'], 'rb') do |f| f.read end text = File.open(vpn['status_file'], 'rb', &:read)
case vpn['version'] case vpn['version']
when 1 when 1
@ -78,21 +78,21 @@ module OpenVPNStatusWeb
def self.run! def self.run!
if ARGV.length != 1 if ARGV.length != 1
puts "Usage: openvpn-status-web config_file" puts 'Usage: openvpn-status-web config_file'
exit 1 exit 1
end end
config_file = ARGV[0] config_file = ARGV[0]
if not File.file?(config_file) if !File.file?(config_file)
puts "Config file not found!" puts 'Config file not found!'
exit 1 exit 1
end end
puts "openvpn-status-web version #{OpenVPNStatusWeb::VERSION}" puts "openvpn-status-web version #{OpenVPNStatusWeb::VERSION}"
puts "Using config file #{config_file}" puts "Using config file #{config_file}"
config = YAML::load(File.open(config_file, 'r') { |f| f.read }) config = YAML.safe_load(File.open(config_file, 'r', &:read))
if config['logfile'] if config['logfile']
OpenVPNStatusWeb.logger = Logger.new(config['logfile']) OpenVPNStatusWeb.logger = Logger.new(config['logfile'])
@ -100,10 +100,10 @@ module OpenVPNStatusWeb
OpenVPNStatusWeb.logger = Logger.new(STDOUT) OpenVPNStatusWeb.logger = Logger.new(STDOUT)
end end
OpenVPNStatusWeb.logger.progname = "openvpn-status-web" OpenVPNStatusWeb.logger.progname = 'openvpn-status-web'
OpenVPNStatusWeb.logger.formatter = LogFormatter.new OpenVPNStatusWeb.logger.formatter = LogFormatter.new
OpenVPNStatusWeb.logger.info "Starting..." OpenVPNStatusWeb.logger.info 'Starting...'
# drop privs (first change group than user) # drop privs (first change group than user)
Process::Sys.setgid(Etc.getgrnam(config['group']).gid) if config['group'] Process::Sys.setgid(Etc.getgrnam(config['group']).gid) if config['group']
@ -111,21 +111,21 @@ module OpenVPNStatusWeb
# configure rack # configure rack
app = Daemon.new(config['vpns']) app = Daemon.new(config['vpns'])
if ENV['RACK_ENV'] == "development" if ENV['RACK_ENV'] == 'development'
app = BetterErrors::Middleware.new(app) app = BetterErrors::Middleware.new(app)
BetterErrors.application_root = File.expand_path("..", __FILE__) BetterErrors.application_root = File.expand_path(__dir__)
end end
Signal.trap('INT') do Signal.trap('INT') do
OpenVPNStatusWeb.logger.info "Quitting..." OpenVPNStatusWeb.logger.info 'Quitting...'
Rack::Handler::WEBrick.shutdown Rack::Handler::WEBrick.shutdown
end end
Signal.trap('TERM') do Signal.trap('TERM') do
OpenVPNStatusWeb.logger.info "Quitting..." OpenVPNStatusWeb.logger.info 'Quitting...'
Rack::Handler::WEBrick.shutdown Rack::Handler::WEBrick.shutdown
end end
Rack::Handler::WEBrick.run app, :Host => config['host'], :Port => config['port'] Rack::Handler::WEBrick.run app, Host: config['host'], Port: config['port']
end end
end end
end end

View File

@ -1,16 +1,16 @@
class Integer class Integer
def as_bytes def as_bytes
return "1 Byte" if self == 1 return '1 Byte' if self == 1
label = ["Bytes", "KiB", "MiB", "GiB", "TiB"] label = %w[Bytes KiB MiB GiB TiB]
i = 0 i = 0
num = self.to_f num = to_f
while num >= 1024 do while num >= 1024
num = num / 1024 num /= 1024
i += 1 i += 1
end end
"#{format('%.2f', num)} #{label[i]}" "#{format('%.2f', num)} #{label[i]}"
end end
end end

View File

@ -10,29 +10,27 @@ 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 << parse_client(parts[1..5]) if parts[0] == "CLIENT_LIST" status.client_list << parse_client(parts[1..5]) if parts[0] == 'CLIENT_LIST'
status.routing_table << parse_route(parts[1..4]) if parts[0] == "ROUTING_TABLE" status.routing_table << parse_route(parts[1..4]) if parts[0] == 'ROUTING_TABLE'
status.global_stats << parse_global(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 private_class_method def self.parse_client(client)
def self.parse_client(client)
client[2] = client[2].to_i client[2] = client[2].to_i
client[3] = client[3].to_i client[3] = client[3].to_i
client[4] = DateTime.strptime(client[4], '%a %b %d %k:%M:%S %Y') client[4] = DateTime.strptime(client[4], '%a %b %d %k:%M:%S %Y')
client client
end end
def self.parse_route(route) private_class_method def self.parse_route(route)
route[3] = DateTime.strptime(route[3], '%a %b %d %k:%M:%S %Y') route[3] = DateTime.strptime(route[3], '%a %b %d %k:%M:%S %Y')
route route
end end
def self.parse_global(global) private_class_method def self.parse_global(global)
global[1] = global[1].to_i global[1] = global[1].to_i
global global
end end

View File

@ -13,7 +13,7 @@ module OpenVPNStatusWeb
(current_section = :rt; next) if line == "ROUTING TABLE\n" (current_section = :rt; next) if line == "ROUTING TABLE\n"
(current_section = :gs; next) if line == "GLOBAL STATS\n" (current_section = :gs; next) if line == "GLOBAL STATS\n"
(current_section = :end; next) if line == "END\n" (current_section = :end; next) if line == "END\n"
case current_section case current_section
when :cl when :cl
client_list << line.strip.split(',') client_list << line.strip.split(',')

View File

@ -1,4 +1,4 @@
module OpenVPNStatusWeb module OpenVPNStatusWeb
VERSION = "2.0.0" VERSION = '2.0.0'.freeze
end end

View File

@ -26,9 +26,10 @@ Gem::Specification.new do |s|
s.add_development_dependency 'better_errors' s.add_development_dependency 'better_errors'
s.add_development_dependency 'binding_of_caller' s.add_development_dependency 'binding_of_caller'
s.add_development_dependency 'bundler' s.add_development_dependency 'bundler'
s.add_development_dependency 'bundler-audit' s.add_development_dependency 'bundler-audit', '~> 0.6.0'
s.add_development_dependency 'rack-test' s.add_development_dependency 'rack-test'
s.add_development_dependency 'rake' s.add_development_dependency 'rake'
s.add_development_dependency 'rspec' s.add_development_dependency 'rspec'
s.add_development_dependency 'rubocop', '~> 0.80.0'
s.add_development_dependency 'solargraph' s.add_development_dependency 'solargraph'
end end

View File

@ -8,47 +8,56 @@ describe OpenVPNStatusWeb::Parser::ModernStateless do
context "for status-version #{version}" do context "for status-version #{version}" do
context 'for client list' do context 'for client list' do
it 'parses common names' do it 'parses common names' do
expect(status.client_list.map { |client| client[0] }).to eq(["foo", "bar"]) expect(status.client_list.map { |client| client[0] }).to eq(%w[foo bar])
end end
it 'parses real addresses' do it 'parses real addresses' do
expect(status.client_list.map { |client| client[1] }).to eq(["1.2.3.4:1234", "1.2.3.5:1235"]) expect(status.client_list.map { |client| client[1] }).to eq(['1.2.3.4:1234', '1.2.3.5:1235'])
end end
it 'parses received bytes' do it 'parses received bytes' do
expect(status.client_list.map { |client| client[2] }).to eq([11811160064, 512]) expect(status.client_list.map { |client| client[2] }).to eq([11_811_160_064, 512])
end end
it 'parses sent bytes' do it 'parses sent bytes' do
expect(status.client_list.map { |client| client[3] }).to eq([4194304, 2048]) expect(status.client_list.map { |client| client[3] }).to eq([4_194_304, 2048])
end end
it 'parses connected since date' do it 'parses connected since date' do
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)]) 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)
]
)
end end
end end
context 'for routing table' do context 'for routing table' do
it 'parses virtual addresses' do it 'parses virtual addresses' do
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"]) 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'])
end end
it 'parses common names' do it 'parses common names' do
expect(status.routing_table.map { |route| route[1] }).to eq(["foo", "bar", "foo", "bar"]) expect(status.routing_table.map { |route| route[1] }).to eq(%w[foo bar foo bar])
end end
it 'parses real addresses' do it 'parses real addresses' do
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"]) 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'])
end end
it 'parses last ref date' do it 'parses last ref date' do
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)]) 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)
]
)
end end
end end
it 'parses global stats' do it 'parses global stats' do
expect(status.global_stats.size).to eq(1) expect(status.global_stats.size).to eq(1)
expect(status.global_stats.first).to eq(["Max bcast/mcast queue length", 42]) expect(status.global_stats.first).to eq(['Max bcast/mcast queue length', 42])
end end
end end
end end

View File

@ -1,50 +1,61 @@
require 'spec_helper' require 'spec_helper'
describe OpenVPNStatusWeb::Parser::V1 do describe OpenVPNStatusWeb::Parser::V1 do
def status; status_v1; end def status
status_v1
end
context 'for client list' do context 'for client list' do
it 'parses common names' do it 'parses common names' do
expect(status.client_list.map { |client| client[0] }).to eq(["foo", "bar"]) expect(status.client_list.map { |client| client[0] }).to eq(%w[foo bar])
end end
it 'parses real addresses' do it 'parses real addresses' do
expect(status.client_list.map { |client| client[1] }).to eq(["1.2.3.4:1234", "1.2.3.5:1235"]) expect(status.client_list.map { |client| client[1] }).to eq(['1.2.3.4:1234', '1.2.3.5:1235'])
end end
it 'parses received bytes' do it 'parses received bytes' do
expect(status.client_list.map { |client| client[2] }).to eq([11811160064, 512]) expect(status.client_list.map { |client| client[2] }).to eq([11_811_160_064, 512])
end end
it 'parses sent bytes' do it 'parses sent bytes' do
expect(status.client_list.map { |client| client[3] }).to eq([4194304, 2048]) expect(status.client_list.map { |client| client[3] }).to eq([4_194_304, 2048])
end end
it 'parses connected since date' do it 'parses connected since date' do
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)]) 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)
]
)
end end
end end
context 'for routing table' do context 'for routing table' do
it 'parses virtual addresses' do it 'parses virtual addresses' do
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"]) 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'])
end end
it 'parses common names' do it 'parses common names' do
expect(status.routing_table.map { |route| route[1] }).to eq(["foo", "bar", "foo", "bar"]) expect(status.routing_table.map { |route| route[1] }).to eq(%w[foo bar foo bar])
end end
it 'parses real addresses' do it 'parses real addresses' do
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"]) 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'])
end end
it 'parses last ref date' do it 'parses last ref date' do
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)]) 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)
]
)
end end
end end
it 'parses global stats' do it 'parses global stats' do
expect(status.global_stats.size).to eq(1) expect(status.global_stats.size).to eq(1)
expect(status.global_stats.first).to eq(["Max bcast/mcast queue length", 42]) expect(status.global_stats.first).to eq(['Max bcast/mcast queue length', 42])
end end
end end

View File

@ -6,16 +6,16 @@ require 'rack/test'
require 'openvpn-status-web' require 'openvpn-status-web'
def status_v1 def status_v1
text = File.open('examples/status.v1', 'rb') do |f| f.read end text = File.open('examples/status.v1', 'rb', &:read)
OpenVPNStatusWeb::Parser::V1.new.parse_status_log text OpenVPNStatusWeb::Parser::V1.new.parse_status_log text
end end
def status_v2 def status_v2
text = File.open('examples/status.v2', 'rb') do |f| f.read end text = File.open('examples/status.v2', 'rb', &:read)
OpenVPNStatusWeb::Parser::V2.new.parse_status_log text OpenVPNStatusWeb::Parser::V2.new.parse_status_log text
end end
def status_v3 def status_v3
text = File.open('examples/status.v3', 'rb') do |f| f.read end text = File.open('examples/status.v3', 'rb', &:read)
OpenVPNStatusWeb::Parser::V3.new.parse_status_log text OpenVPNStatusWeb::Parser::V3.new.parse_status_log text
end end