- mgr <- newManager def
- forever $ do
- l <- getLine
- case pdnsParse ver l of
- Left e -> putStrLn $ "ERROR\t" ++ e
- Right preq -> do
- case preq of
- PdnsRequestQ qn qt id lip rip eip -> do
- ncres <- queryNmc mgr cfg (qName preq) (qType preq) (iD preq)
- case ncres of
- Left e -> putStrLn $ "ERROR\t" ++ e
- Right dom -> putStrLn $ pdnsOut dom
- PdnsRequestAXFR xfrreq ->
- putStrLn ("ERROR\t No support for AXFR " ++ xfrreq)
- PdnsRequestPing -> putStrLn "OK"
+ mgr <- newManager defaultManagerSettings
+
+ let
+ 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
+ gen <- io $ nmcAge
+ (count, cache) <- get
+ case pdnsParse ver l of
+ Left e -> io $ putStr $ pdnsReport e
+ Right preq -> do
+ case preq of
+ PdnsRequestQ qname qtype id _ _ _ -> do
+ io $ queryDom (queryOpNmc cfg mgr id) qname
+ >>= putStr . (pdnsOutQ ver count gen qname qtype)
+ {-
+ -- debug
+ io $ putStrLn $ "LOG\tRequest number " ++ (show count)
+ ++ " id: " ++ (show id)
+ ++ " qname: " ++ qname
+ ++ " qtype: " ++ (show qtype)
+ ++ " cache size: " ++ (show (size cache))
+ -- end debug
+ -}
+ put $ stow qname (count, cache)
+ PdnsRequestAXFR xrq ->
+ case fetch xrq cache of
+ Nothing ->
+ io $ putStr $
+ pdnsReport ("AXFR for unknown id: " ++ (show xrq))
+ Just qname ->
+ io $ queryDom (queryOpNmc cfg mgr xrq) qname
+ >>= putStr . (pdnsOutXfr ver count gen qname)
+ PdnsRequestPing -> io $ putStrLn "END"
+
+ runStateT mainloop (0, empty) >> return ()
+
+-- helper for command-line tools
+
+pdnsOut gen key qt dom =
+ case qt of
+ "AXFR" -> pdnsOutXfr 1 (-1) gen key dom
+ _ -> pdnsOutQ 1 (-1) gen key (rrType qt) dom
+
+-- run one query by key from Namecoin, print domain object and answer
+
+mainOne gen key qt = do
+ cfg <- readConfig confFile
+ mgr <- newManager defaultManagerSettings
+ dom <- queryDom (queryOpNmc cfg mgr (-1)) key
+ putStrLn $ ppShow dom
+ putStr $ pdnsOut gen key qt dom
+
+-- get data from the file, print domain object and answer
+
+mainFile gen key qt = do
+ dom <- queryDom queryOpFile key
+ putStrLn $ ppShow dom
+ putStr $ pdnsOut gen key qt dom
+
+-- Entry point
+
+main = do
+ args <- getArgs
+ gen <- nmcAge
+ let
+ with f xs = case xs of
+ [qfqdn, qtype] -> f gen qfqdn qtype
+ _ -> error $ "usage: empty args, or \"[-f] <fqdn> {<TYPE>|ANY|AXFR}\""
+ ++ " (type in caps)"
+ case args of
+ [] -> mainPdnsNmc
+ "-f":xs -> with mainFile xs
+ _ -> with mainOne args