+module PowerDns where
+
+data RRType = RRTypeSRV | RRTypeA | RRTypeAAAA | RRTypeCNAME
+ | RRTypeDNAME | RRTypeSOA | RRTypeRP | RRTypeLOC
+ | RRTypeNS | RRTypeDS
+ | RRTypeANY | RRTypeError String
+ deriving (Show)
+
+data PdnsRequest = PdnsRequestQ
+ { qName :: String
+ , qType :: RRType
+ , iD :: String
+ , remoteIpAddress :: String
+ , localIpAddress :: Maybe String
+ , ednsSubnetAddress :: Maybe String
+ }
+ | PdnsRequestAXFR String
+ | PdnsRequestPing
+ deriving (Show)
+
+pdnsParse ver s =
+ let
+ getQt qt = case qt of
+ "SRV" -> RRTypeSRV
+ "A" -> RRTypeA
+ "AAAA" -> RRTypeAAAA
+ "CNAME" -> RRTypeCNAME
+ "DNAME" -> RRTypeDNAME
+ "SOA" -> RRTypeSOA
+ "RP" -> RRTypeRP
+ "LOC" -> RRTypeLOC
+ "NS" -> RRTypeNS
+ "DS" -> RRTypeDS
+ "ANY" -> RRTypeANY
+ _ -> RRTypeError qt
+ getLIp ver xs
+ | ver >= 2 = case xs of
+ x:_ -> Just x
+ _ -> Nothing
+ | otherwise = Nothing
+ getRIp ver xs
+ | ver >= 3 = case xs of
+ _:x:_ -> Just x
+ _ -> Nothing
+ | otherwise = Nothing
+ in
+ case words s of
+ "PING":[] -> Right PdnsRequestPing
+ "AXFR":x:[] -> Right (PdnsRequestAXFR x)
+ "Q":qn:"IN":qt:id:rip:xs -> Right (PdnsRequestQ
+ { qName = qn
+ , qType = getQt qt
+ , iD = id
+ , remoteIpAddress = rip
+ , localIpAddress = getLIp ver xs
+ , ednsSubnetAddress = getRIp ver xs
+ })
+ _ -> Left s
+
+{-
+pdnsOut :: String -> Either String PdnsRequest -> IO ()
+pdnsOut _ (Left e) = putStrLn ("ERROR\tUnparseable request: " ++ e)
+pdnsOut uri (Right rq) = case rq of
+ PdnsRequestQ qn qt id lip rip eip -> do
+ dom <- queryNmc uri qn qt id
+ case dom of
+ Left e -> putStrLn ("ERROR\tNmc query error: " ++ e)
+ Right result -> print result
+ PdnsRequestAXFR xfrreq ->
+ putStrLn ("ERROR\t No support for AXFR " ++ xfrreq)
+ PdnsRequestPing -> putStrLn "OK"
+-}