X-Git-Url: http://www.average.org/gitweb/?p=pdns-pipe-nmc.git;a=blobdiff_plain;f=pdns-pipe-nmc.hs;h=82c320d63936a94883b7a776d24e76d66f4e695f;hp=a933c9ca70ade2f57d3c3a46b91b80923bf41d90;hb=8c8cc995d35f462dbfdb7279f7e6da9bf27b670b;hpb=26b23d266b588ea4b5bc4d53cbf479f9b40d26a0 diff --git a/pdns-pipe-nmc.hs b/pdns-pipe-nmc.hs index a933c9c..82c320d 100644 --- a/pdns-pipe-nmc.hs +++ b/pdns-pipe-nmc.hs @@ -5,7 +5,7 @@ module Main where 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 @@ -41,22 +41,32 @@ qReq cf q id = applyBasicAuth (C.pack (rpcuser cf)) (C.pack (rpcpassword cf)) 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 +descend subdom dom = dom --FIXME + +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 $ descend xs dom _ -> return $ Left "Only \".bit\" domain is supported" @@ -86,14 +96,18 @@ main = 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)