case parseJsonRpc (responseBody rsp) :: Either JsonRpcError NmcRes of
Left jerr ->
case (jrpcErrCode jerr) of
- -4 -> Right "{}" -- this is how non-existent entry is returned
- _ -> Left $ "JsonRpc error response: " ++ (show jerr)
+ (-4) -> Right "{}" -- this is how non-existent entry is returned
+ _ -> Left $ "JsonRpc error response: " ++ (show jerr)
Right jrsp -> Right $ resValue jrsp
-- NMC interface
hSetBuffering stdin LineBuffering
hSetBuffering stdout LineBuffering
+
ver <- do
let
loopErr e = forever $ do
putStrLn $ "OK\tDnsNmc ready to serve, protocol v." ++ (show ver)
mgr <- newManager def
+
let
- newcache count name = (insert count name)
- . (delete (if count >= 10 then count - 10 else count + 90))
+ fetch = lookup
+ -- Save the name under current count, increment count for the next run
+ -- so the name is saved under the count that was put into the response.
+ stow name (count, cache) =
+ (if count >= 99 then 0 else count + 1
+ , insert count name
+ $ delete (if count >= 10 then count - 10 else count + 90) cache
+ )
io = liftIO
+
mainloop = forever $ do
l <- io getLine
(count, cache) <- get
case preq of
PdnsRequestQ qname qtype id _ _ _ -> do
io $ queryDom (queryOpNmc cfg mgr id) qname
- >>= putStr . (pdnsOut ver count qname qtype)
+ >>= putStr . (pdnsOutQ ver count qname qtype)
+ -- debug
io $ putStrLn $ "LOG\tRequest number " ++ (show count)
++ " id: " ++ (show id)
++ " qname: " ++ qname
++ " qtype: " ++ (show qtype)
++ " cache size: " ++ (show (size cache))
- put (if count >= 99 then 0 else count + 1,
- newcache count qname cache)
+ -- end debug
+ put $ stow qname (count, cache)
PdnsRequestAXFR xrq ->
- case lookup xrq cache of
+ case fetch xrq cache of
Nothing ->
io $ putStr $
pdnsReport ("AXFR for unknown id: " ++ (show xrq))
io $ queryDom (queryOpNmc cfg mgr xrq) qname
>>= putStr . (pdnsOutXfr ver count qname)
PdnsRequestPing -> io $ putStrLn "END"
+
runStateT mainloop (0, empty) >> return ()
+-- helper for command-line tools
+
+pdnsOut key qt dom =
+ case qt of
+ "AXFR" -> pdnsOutXfr 1 (-1) key dom
+ _ -> pdnsOutQ 1 (-1) key (rrType qt) dom
+
-- query by key from Namecoin
-mainOne key = do
+mainOne key qt = do
cfg <- readConfig confFile
mgr <- newManager def
dom <- queryDom (queryOpNmc cfg mgr (-1)) key
putStrLn $ ppShow dom
- putStr $ pdnsOut 1 (-1) key RRTypeANY dom
+ putStr $ pdnsOut key qt dom
-- using file backend for testing json domain data
-mainFile key = do
+mainFile key qt = do
dom <- queryDom queryOpFile key
putStrLn $ ppShow dom
- putStr $ pdnsOut 1 (-1) key RRTypeANY dom
+ putStr $ pdnsOut key qt dom
-- Entry point
main = do
args <- getArgs
case args of
- [] -> mainPdnsNmc
- [key] -> mainOne key
- ["-f",key] -> mainFile key
- _ -> error $ "usage: empty args, or \"[-f] <fqdn>\""
+ [] -> mainPdnsNmc
+ [key, qtype] -> mainOne key qtype
+ ["-f" ,key, qtype] -> mainFile key qtype
+ _ -> error $ "usage: empty args, or \"[-f] <fqdn> {<TYPE>|ANY|AXFR}\" (type in caps)"