class GoogleWebTranslate::ServerList
Constants
- MAX_TTL
Public Class Methods
next_server(rate_limit = nil)
click to toggle source
# File lib/google_web_translate/server_list.rb, line 14 def next_server(rate_limit = nil) @mutex ||= Mutex.new @mutex.synchronize do @counter ||= 0 @counter += 1 list = servers.sort_by { |i| i.counter || 0 } server = list[0] server.counter = @counter sleep(rate_limit_delay(server, rate_limit)) server.last_used_at = Time.now server end end
servers()
click to toggle source
# File lib/google_web_translate/server_list.rb, line 9 def servers update_servers if @servers.nil? @servers.dup end
Private Class Methods
data_dir()
click to toggle source
# File lib/google_web_translate/server_list.rb, line 67 def data_dir File.join(__dir__, '..', '..', 'data') end
hostnames()
click to toggle source
# File lib/google_web_translate/server_list.rb, line 79 def hostnames names = [] lines = File.read(url_list_path).split(/[\r\n]+/) lines.each do |host| next unless host && !host.empty? names << "translate.#{host}" end names end
initial_data()
click to toggle source
# File lib/google_web_translate/server_list.rb, line 98 def initial_data hostnames.collect do |host| server = Server.new server.host = host server end end
rate_limit_delay(server, rate_limit)
click to toggle source
# File lib/google_web_translate/server_list.rb, line 33 def rate_limit_delay(server, rate_limit) return 0 unless rate_limit && server.last_used_at delay = rate_limit - (Time.now - server.last_used_at) delay < 0 || ENV['TEST'] ? 0 : delay end
read_server_data()
click to toggle source
# File lib/google_web_translate/server_list.rb, line 106 def read_server_data return initial_data unless File.exist?(server_data_path) data = JSON.parse(File.read(server_data_path)) server_list = [] data.each do |entry| attributes = SERVER_ATTRIBUTES.collect { |i| entry[i.to_s] } server = Server.new(*attributes) next unless server.host && !server.host.empty? server.counter = 0 server_list << server end server_list end
resolve_ip(host)
click to toggle source
# File lib/google_web_translate/server_list.rb, line 130 def resolve_ip(host) resolver.getaddress(host).to_s end
resolver()
click to toggle source
# File lib/google_web_translate/server_list.rb, line 124 def resolver resolver = Resolv::DNS.new resolver.timeouts = 5 resolver end
save_server_data(servers)
click to toggle source
# File lib/google_web_translate/server_list.rb, line 120 def save_server_data(servers) File.write(server_data_path, servers.to_json) end
server_data_path()
click to toggle source
# File lib/google_web_translate/server_list.rb, line 71 def server_data_path File.join(data_dir, 'server_data.txt') end
unique_servers(list)
click to toggle source
# File lib/google_web_translate/server_list.rb, line 89 def unique_servers(list) server_by_ip = {} list.each do |server| next unless server.available server_by_ip[server.ip] = server end server_by_ip.values end
update_server(server)
click to toggle source
# File lib/google_web_translate/server_list.rb, line 54 def update_server(server) now = Time.now.to_i if server.resolved_at.nil? || now - server.resolved_at > MAX_TTL #|| !server.available server.resolved_at = now server.ip = resolve_ip(server.host) end server.available = true rescue Resolv::ResolvError # puts "server #{server.host} is unavailable: #{e}" server.available = false end
update_servers()
click to toggle source
# File lib/google_web_translate/server_list.rb, line 39 def update_servers server_list = read_server_data pool = Concurrent::CachedThreadPool.new # puts "updating #{server_list.length} servers" server_list.each do |server| pool.post { update_server(server) } end pool.shutdown pool.wait_for_termination @servers = unique_servers(server_list) # puts "#{@servers.length} unique servers found" save_server_data(server_list) end
url_list_path()
click to toggle source
# File lib/google_web_translate/server_list.rb, line 75 def url_list_path File.join(data_dir, 'urls.txt') end