module Main where
+import System.IO
import Control.Monad
import qualified Data.ByteString.Char8 as C (pack, unpack)
import qualified Data.ByteString.Lazy.Char8 as L (pack, unpack)
-import Data.ByteString.Lazy as BS hiding (reverse, putStrLn)
+import Data.ByteString.Lazy as BS hiding (reverse, putStr, putStrLn)
import Data.List.Split
import Data.Aeson (encode, decode, Value(..))
import Network.HTTP.Types
qRsp :: Response ByteString -> Either String NmcDom
qRsp rsp =
case parseJsonRpc (responseBody rsp) :: Either JsonRpcError NmcRes of
- Left jerr -> Left $ "Unparseable response: " ++ (show (responseBody rsp))
+ Left jerr ->
+ case (jrpcErrCode jerr) of
+ -4 -> Right emptyNmcDom
+ _ -> Left $ "JsonRpc error response: " ++ (show jerr)
Right jrsp ->
- case decode (resValue jrsp) :: Maybe NmcDom of
- Nothing -> Left $ "Unparseable value: " ++ (show (resValue jrsp))
- Just dom -> Right dom
+ case resValue jrsp of
+ "" -> Right emptyNmcDom
+ vstr ->
+ case decode vstr :: Maybe NmcDom of
+ Nothing -> Left $ "Unparseable value: " ++ (show vstr)
+ Just dom -> Right dom
-- NMC interface
-queryNmc :: Manager -> Config -> String -> RRType -> String
+queryNmc :: Manager -> Config -> String -> String
-> IO (Either String NmcDom)
-queryNmc mgr cfg fqdn qtype qid = do
+queryNmc mgr cfg fqdn qid = do
case reverse (splitOn "." fqdn) of
"bit":dn:xs -> do
rsp <- runResourceT $
httpLbs (qReq cfg (L.pack ("d/" ++ dn)) (L.pack qid)) mgr
- return $ qRsp rsp
+ return $ case qRsp rsp of
+ Left err -> Left err
+ Right dom -> Right $ descendNmc xs dom
_ ->
return $ Left "Only \".bit\" domain is supported"
cfg <- readConfig confFile
+ hSetBuffering stdin LineBuffering
+ hSetBuffering stdout LineBuffering
ver <- do
let
loopErr e = forever $ do
forever $ do
l <- getLine
case pdnsParse ver l of
- Left e -> putStrLn $ "ERROR\t" ++ e
+ Left e -> putStr $ pdnsReport 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
+ PdnsRequestQ qname qtype id _ _ _ ->
+ queryNmc mgr cfg qname id >>= putStr . (pdnsOut ver id qname qtype)
PdnsRequestAXFR xfrreq ->
- putStrLn ("ERROR\t No support for AXFR " ++ xfrreq)
- PdnsRequestPing -> putStrLn "OK"
+ putStr $ pdnsReport ("No support for AXFR " ++ xfrreq)
+ PdnsRequestPing -> putStrLn "END"
+
+-- for testing
+
+ask str = do
+ cfg <- readConfig confFile
+ mgr <- newManager def
+ queryNmc mgr cfg str "askid" >>= putStr . (pdnsOut 1 "askid" str RRTypeANY)