class Girl::Relay

Public Class Methods

new( config_path = nil ) click to toggle source
# File lib/girl/relay.rb, line 16
def initialize( config_path = nil )
  unless config_path then
    config_path = File.expand_path( '../girl.conf.json', __FILE__ )
  end

  raise "missing config file #{ config_path }" unless File.exist?( config_path )

  conf = JSON.parse( IO.binread( config_path ), symbolize_names: true )
  resolv_port = conf[ :resolv_port ]
  nameserver = conf[ :nameserver ]
  resolvd_port = conf[ :resolvd_port ]
  redir_port = conf[ :relay_port ]
  proxyd_host = conf[ :proxyd_host ]
  proxyd_port = conf[ :proxyd_port ]
  direct_path = conf[ :direct_path ]
  remote_path = conf[ :remote_path ]
  im = conf[ :im ]

  unless resolv_port then
    resolv_port = 1053
  end

  unless nameserver then
    nameserver = '114.114.114.114'
  end

  unless resolvd_port then
    resolvd_port = 5353
  end

  unless redir_port then
    redir_port = 1066
  end

  raise "missing proxyd host" unless proxyd_host

  unless proxyd_port then
    proxyd_port = 6060
  end

  directs = []

  if direct_path then
    raise "not found direct file #{ direct_path }" unless File.exist?( direct_path )
    directs = ( RESERVED_ROUTE.split( "\n" ) + IO.binread( direct_path ).split( "\n" ) ).map{ | line | IPAddr.new( line.strip ) }
  end

  remotes = []

  if remote_path then
    raise "not found remote file #{ remote_path }" unless File.exist?( remote_path )
    remotes = IO.binread( remote_path ).split( "\n" ).map{ | line | line.strip }
  end

  unless im then
    im = 'girl'
  end

  im = "#{ im }-relay"

  puts "girl relay #{ Girl::VERSION }"
  puts "resolv #{ resolv_port } nameserver #{ nameserver } resolvd #{ resolvd_port } redir #{ redir_port } proxyd #{ proxyd_host } #{ proxyd_port } im #{ im }"
  puts "#{ direct_path } #{ directs.size } directs"
  puts "#{ remote_path } #{ remotes.size } remotes"

  worker = Girl::RelayWorker.new( resolv_port, nameserver, resolvd_port, redir_port, proxyd_host, proxyd_port, directs, remotes, im )

  Signal.trap( :TERM ) do
    puts 'exit'
    worker.quit!
  end

  worker.looping
end