]> gitweb @ CieloNegro.org - haskell-dns.git/blobdiff - ExampleDNSServer.hs
Farewell to the Sanity.hs
[haskell-dns.git] / ExampleDNSServer.hs
index b366e14e1a9dc5d5b07b2ee57ced84ead301e358..8c9919535dfd901cd67a81062ef7e9830debc836 100644 (file)
@@ -1,44 +1,74 @@
 import           Network.DNS.Message
 import           Network.DNS.Named
 import           Network.DNS.Named.Config
-import           Network.DNS.Named.Responder
 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 name
+      findZone :: DomainName -> Maybe Zone
+      findZone name
           | name `isInZone` zone = Just zone
           | otherwise            = Nothing
 
       zone :: Zone
       zone = Zone {
-               zoneName            = mkDN "cielonegro.org."
-             , zoneResponders      = [ wrapResponder responderA
-                                     ]
-             , zoneIsAuthoritative = True
+               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
              }
 
-      responderA :: Responder A IN ()
-      responderA = do name <- getQueryName
-                      if name == mkDN "ns.cielonegro.org." then
-                          respond ResourceRecord {
-                                        rrName  = name
-                                      , rrType  = A
-                                      , rrClass = IN
-                                      , rrTTL   = 9600
-                                      , rrData  = inetAddr "127.0.0.1"
-                                      }
-                        else
-                          fail "FIXME: we want to throw NameError but we can't for now"
+      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