import Network.DNS.Message
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
+ cnfServerPort = "9090"
+ , cnfAllowTransfer = True
}
- 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 "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