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