class OpenVPNStatusWeb::Daemon
Public Class Methods
new(vpns)
click to toggle source
# File lib/openvpn-status-web.rb, line 46 def initialize(vpns) @vpns = vpns @main_tmpl = read_template(File.join(File.dirname(__FILE__), 'openvpn-status-web/main.html.erb')) end
run!()
click to toggle source
@return [void]
# File lib/openvpn-status-web.rb, line 90 def self.run! if ARGV.length != 1 puts 'Usage: openvpn-status-web config_file' exit 1 end config_file = ARGV[0] if !File.file?(config_file) puts 'Config file not found!' exit 1 end puts "openvpn-status-web version #{OpenVPNStatusWeb::VERSION}" puts "Using config file #{config_file}" config = YAML.safe_load(File.read(config_file, mode: 'r')) if config['logfile'] OpenVPNStatusWeb.logger = Logger.new(config['logfile']) else OpenVPNStatusWeb.logger = Logger.new($stdout) end OpenVPNStatusWeb.logger.progname = 'openvpn-status-web' OpenVPNStatusWeb.logger.formatter = LogFormatter.new OpenVPNStatusWeb.logger.info 'Starting...' # drop priviliges as soon as possible # NOTE: first change group than user if config['group'] group = Etc.getgrnam(config['group']) Process::Sys.setgid(group.gid) if group end if config['user'] user = Etc.getpwnam(config['user']) Process::Sys.setuid(user.uid) if user end # configure rack app = Daemon.new(config['vpns']) if ENV.fetch('RACK_ENV', nil) == 'development' app = BetterErrors::Middleware.new(app) BetterErrors.application_root = File.expand_path(__dir__) end Signal.trap('INT') do OpenVPNStatusWeb.logger.info 'Quitting...' Rackup::Handler::WEBrick.shutdown end Signal.trap('TERM') do OpenVPNStatusWeb.logger.info 'Quitting...' Rackup::Handler::WEBrick.shutdown end Rackup::Handler::WEBrick.run app, Host: config['host'], Port: config['port'] end
Public Instance Methods
call(env)
click to toggle source
# File lib/openvpn-status-web.rb, line 52 def call(env) 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'] != '/' # variables for template vpns = @vpns stati = {} @vpns.each do |name, config| stati[name] = parse_status_log(config) end # eval html = @main_tmpl.result(binding) [200, {'Content-Type' => 'text/html'}, [html]] end
parse_status_log(vpn)
click to toggle source
# File lib/openvpn-status-web.rb, line 74 def parse_status_log(vpn) text = File.read(vpn['status_file'], mode: 'rb') case vpn['version'] when 1 OpenVPNStatusWeb::Parser::V1.new.parse_status_log(text) when 2 OpenVPNStatusWeb::Parser::V2.new.parse_status_log(text) when 3 OpenVPNStatusWeb::Parser::V3.new.parse_status_log(text) else raise "No suitable parser for status-version #{vpn['version']}" end end
read_template(file)
click to toggle source
# File lib/openvpn-status-web.rb, line 68 def read_template(file) text = File.read(file, mode: 'rb') ERB.new(text) end