1#!/usr/bin/env ruby 2 3require 'rubygems' 4require 'bundler/setup' 5require 'json' 6require 'thread' 7require 'webrick' 8require './unittest' 9 10class DNSBackendHandler < WEBrick::HTTPServlet::AbstractServlet 11 def initialize(server, dnsbackend) 12 @dnsbackend = dnsbackend 13 @semaphore = Mutex.new 14 @f = File.open("/tmp/remotebackend.txt.#{$$}","a") 15 @f.sync 16 end 17 18 def do_POST(req,res) 19 req.continue 20 21 return 400, "Bad request" unless req.path == "/dns/endpoint.json" 22 23 tmp = JSON::parse(req.body) 24 method = tmp["method"].downcase 25 method = "do_#{method}" 26 args = tmp["parameters"] 27 28 @f.puts "#{Time.now.to_f} [http/json]: #{({:method=>method,:parameters=>args}).to_json}" 29 30 @semaphore.synchronize do 31 if @dnsbackend.respond_to?(method.to_sym) 32 result, log = @dnsbackend.send(method.to_sym, args) 33 body = {:result => result, :log => log} 34 res.status = 200 35 res["Content-Type"] = "application/javascript; charset=utf-8" 36 res.body = body.to_json 37 else 38 res.status = 404 39 res["Content-Type"] = "application/javascript; charset=utf-8" 40 res.body = ({:result => false, :log => ["Method not found"]}).to_json 41 end 42 @f.puts "#{Time.now.to_f} [http/json]: #{res.body}" 43 end 44 end 45end 46 47server = WEBrick::HTTPServer.new( 48 :Port=>62434, 49 :BindAddress=>"localhost", 50# Logger: WEBrick::Log.new("remotebackend-server.log"), 51 :AccessLog=>[ [ File.open("remotebackend-access.log", "w"), WEBrick::AccessLog::COMBINED_LOG_FORMAT ] ] 52) 53 54be = Handler.new 55server.mount "/dns", DNSBackendHandler, be 56server.mount_proc("/ping"){ |req,resp| resp.body = "pong" } 57 58trap('INT') { server.stop } 59trap('TERM') { server.stop } 60 61server.start 62