From: Eugene Crosser Date: Tue, 3 Jun 2014 15:18:20 +0000 (+0400) Subject: support powerdns ABI v.4 (#1386) X-Git-Tag: 0.9.0.1~2 X-Git-Url: http://www.average.org/gitweb/?p=pdns-pipe-nmc.git;a=commitdiff_plain;h=18e24a6fca605da574ba3add941ee9981e5396af;hp=92504303416dfc46f1a4e4ed45ddd3203919cf8f support powerdns ABI v.4 (#1386) --- diff --git a/PowerDns.hs b/PowerDns.hs index 9e1da83..7036596 100644 --- a/PowerDns.hs +++ b/PowerDns.hs @@ -58,7 +58,7 @@ data PdnsRequest = PdnsRequestQ , localIpAddress :: Maybe String , ednsSubnetAddress :: Maybe String } - | PdnsRequestAXFR Int + | PdnsRequestAXFR Int (Maybe String) | PdnsRequestPing deriving (Show) @@ -82,7 +82,15 @@ pdnsParse ver s = in case words s of "PING":[] -> Right PdnsRequestPing - "AXFR":x:[] -> Right (PdnsRequestAXFR (getInt x)) + "AXFR":x:xs -> + if ver < 4 then + case xs of + [] -> Right $ (PdnsRequestAXFR (getInt x)) Nothing + _ -> Left $ "Extra arguments in AXFR (v 1-3): " ++ s + else + case xs of + [z] -> Right $ (PdnsRequestAXFR (getInt x)) (Just z) + _ -> Left $ "Wrong arguments in AXFR (v 4+): " ++ s "Q":qn:"IN":qt:id:rip:xs -> case rrType qt of RRTypeError e -> Left $ "Unrecognized RR type: " ++ e @@ -146,9 +154,7 @@ formatRR ver id gen name dom rrtype = ++ "\t" ++ ttl ++ "\t" ++ (show id) ++ "\t" ++ x ++ "\n" ++ a) "" $ dataRR rrtype gen name dom where - v3ext = case ver of - 3 -> "0\t1\t" - _ -> "" + v3ext = if ver >= 3 then "0\t1\t" else "" ttl = show 3600 justl accessor _ _ dom = case accessor dom of diff --git a/pdns-pipe-nmc.hs b/pdns-pipe-nmc.hs index bbe89ab..1f5a891 100644 --- a/pdns-pipe-nmc.hs +++ b/pdns-pipe-nmc.hs @@ -104,6 +104,7 @@ mainPdnsNmc = do ["HELO", "1"] -> return 1 ["HELO", "2"] -> return 2 ["HELO", "3"] -> return 3 + ["HELO", "4"] -> return 4 ["HELO", x ] -> loopErr $ "unsupported ABI version " ++ (show x) _ -> loopErr $ "bad HELO " ++ (show s) @@ -143,14 +144,26 @@ mainPdnsNmc = do -- end debug -} put $ stow qname (count, cache) - PdnsRequestAXFR xrq -> - case fetch xrq cache of - Nothing -> - io $ putStr $ - pdnsReport ("AXFR for unknown id: " ++ (show xrq)) + PdnsRequestAXFR xrq zid -> do + {- + -- debug + io $ putStrLn $ "LOG\tAXFR request id=" ++ (show xrq) + ++ ", zone name: " ++ (show zid) + -- end debug + -} + let + czone = fetch xrq cache + zone = case zid of + Nothing -> czone + Just qname -> Just qname + -- if zid == czone then zid else Nothing -- paranoid + case zone of Just qname -> io $ queryDom (queryOpNmc cfg mgr xrq) qname - >>= putStr . (pdnsOutXfr ver count gen qname) + >>= putStr . (pdnsOutXfr ver count gen qname) + Nothing -> + io $ putStr $ pdnsReport $ "AXFR cannot determine zone: " + ++ (show xrq) ++ ", " ++ (show zid) PdnsRequestPing -> io $ putStrLn "END" runStateT mainloop (0, empty) >> return ()