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