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