X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=ExampleDNSServer.hs;h=8c9919535dfd901cd67a81062ef7e9830debc836;hb=957d3f466cea2fa642f67f477ec4ad9a0d535a9b;hp=e1aaa22e1cf56b86d9c9ce38700073a6bfbadcae;hpb=7a09a987b0369db0c013fb10272329c733ffc8a1;p=haskell-dns.git diff --git a/ExampleDNSServer.hs b/ExampleDNSServer.hs index e1aaa22..8c99195 100644 --- a/ExampleDNSServer.hs +++ b/ExampleDNSServer.hs @@ -3,14 +3,73 @@ import Network.DNS.Named import Network.DNS.Named.Config import Network.DNS.Named.Zone import Network.Socket +import System.IO.Unsafe main :: IO () -main = runNamed cnf zoneFor +main = runNamed cnf (return . findZone) where cnf :: Config cnf = Config { cnfServerAddress = SockAddrInet 9090 iNADDR_ANY } - zoneFor :: DomainName -> Maybe Zone - zoneFor = const Nothing -- FIXME \ No newline at end of file + findZone :: DomainName -> Maybe Zone + findZone name + | name `isInZone` zone = Just zone + | otherwise = Nothing + + zone :: Zone + zone = Zone { + zoneName = mkDN "cielonegro.org." + , zoneSOA = Just SOAFields { + soaMasterNameServer = mkDN "ns.cielonegro.org." + , soaResponsibleMailbox = mkDN "root.ns.cielonegro.org." + , soaSerialNumber = 2008022148 + , soaRefreshInterval = 3600 + , soaRetryInterval = 900 + , soaExpirationLimit = 3600000 + , soaMinimumTTL = 3600 + } + , zoneRecordNames = return [ mkDN "cielonegro.org." + , mkDN "ns.cielonegro.org." + , mkDN "www.cielonegro.org." + , mkDN "git.cielonegro.org." + ] + , zoneResponder = return . responder + } + + responder :: DomainName -> [SomeRR] + responder name + | name == mkDN "ns.cielonegro.org." + = [ wrapRecord ResourceRecord { + rrName = name + , rrType = A + , rrClass = IN + , rrTTL = 9600 + , rrData = inetAddr "127.0.0.1" + } + ] + | name == mkDN "www.cielonegro.org." + = [ wrapRecord ResourceRecord { + rrName = name + , rrType = A + , rrClass = IN + , rrTTL = 9600 + , rrData = inetAddr "127.0.0.2" + } + ] + | name == mkDN "git.cielonegro.org." + = [ wrapRecord ResourceRecord { + rrName = name + , rrType = CNAME + , rrClass = IN + , rrTTL = 9600 + , rrData = mkDN "www.cielonegro.org." + } + ] + | otherwise + = [] -- This means NXDOMAIN. + + +inetAddr :: String -> HostAddress +inetAddr = unsafePerformIO . inet_addr