]> www.average.org Git - pdns-pipe-nmc.git/blobdiff - pdns-pipe-nmc.hs
handle empty 'value' as domain with no data
[pdns-pipe-nmc.git] / pdns-pipe-nmc.hs
index d37491114a9adbc91091b26a95bd1ba4b86f60eb..9e4a72930691ab6b58e53e6220c4d6c495c5e4ce 100644 (file)
@@ -11,8 +11,8 @@ import Data.Aeson (encode, decode, Value(..))
 import Network.HTTP.Types
 import Data.Conduit
 import Network.HTTP.Conduit
-import Data.JsonRpcClient
 
+import JsonRpcClient
 import Config
 import PowerDns
 import NmcJson
@@ -43,15 +43,18 @@ qRsp rsp =
     case parseJsonRpc (responseBody rsp) :: Either JsonRpcError NmcRes of
       Left  jerr -> Left $ "Unparseable response: " ++ (show (responseBody rsp))
       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 $
@@ -83,18 +86,17 @@ main = do
   putStrLn $ "OK\tDnsNmc ready to serve, protocol v." ++ (show ver)
 
   mgr <- newManager def
-
-  print $ qReq cfg "d/nosuchdomain" "query-nmc"
-  rsp <- runResourceT $ httpLbs (qReq cfg "d/nosuchdomain" "query-nmc") mgr
-  print $ (statusCode . responseStatus) rsp
-  putStrLn "===== complete response is:"
-  print rsp
-  let rbody = responseBody rsp
-  putStrLn "===== response body is:"
-  print rbody
-  let result = parseJsonRpc rbody :: Either JsonRpcError NmcRes
-  putStrLn "===== parsed response is:"
-  print result
---  print $ parseJsonRpc (responseBody rsp)
-
-  --forever $ getLine >>= (pdnsOut uri) . (pdnsParse ver)
+  forever $ do
+    l <- getLine
+    case pdnsParse ver l of
+      Left e -> putStrLn $ "ERROR\t" ++ e
+      Right preq -> do
+        case preq of
+          PdnsRequestQ qname qtype id _ _ _ -> do
+            ncres <- queryNmc mgr cfg qname id
+            case ncres of
+              Left  e   -> putStrLn $ "ERROR\t" ++ e
+              Right dom -> putStrLn $ pdnsOut qtype dom
+          PdnsRequestAXFR xfrreq ->
+            putStrLn ("ERROR\tNo support for AXFR " ++ xfrreq)
+          PdnsRequestPing -> putStrLn "OK"