module Network.DNS.Named.Zone
( Zone(..)
- , ZoneFinder(..)
-
, isInZone
- , defaultRootZone
+ , zoneSOARecord
+ , zoneNSRecord
)
where
import Data.Maybe
import Network.DNS.Message
-import Network.DNS.Named.Responder
data Zone
= Zone {
- zoneName :: !DomainName
- , zoneResponders :: ![SomeResponder]
- , zoneIsAuthoritative :: !Bool
+ zoneName :: !DomainName
+ , zoneSOA :: !(Maybe SOAFields)
+ , zoneRecordNames :: !(IO [DomainName])
+ , zoneResponder :: !(DomainName -> IO [SomeRR])
}
-class ZoneFinder a where
- findZone :: a -> DomainName -> IO Zone
-
-instance ZoneFinder (DomainName -> Zone) where
- findZone = (return .)
-
-instance ZoneFinder (DomainName -> IO Zone) where
- findZone = id
-
-instance ZoneFinder (DomainName -> Maybe Zone) where
- findZone = ((return . fromMaybe defaultRootZone) .)
-
-instance ZoneFinder (DomainName -> IO (Maybe Zone)) where
- findZone = (fmap (fromMaybe defaultRootZone) .)
-
-
isInZone :: DomainName -> Zone -> Bool
isInZone name zone = zoneName zone `isZoneOf` name
-
-defaultRootZone :: Zone
-defaultRootZone
- = Zone {
- zoneName = mkDomainName "."
- , zoneResponders = [] -- FIXME
- , zoneIsAuthoritative = False
- }
+zoneSOARecord :: Zone -> Maybe SomeRR
+zoneSOARecord zone
+ = do soa <- zoneSOA zone
+ return $ wrapRecord
+ $ ResourceRecord {
+ rrName = zoneName zone
+ , rrType = SOA
+ , rrClass = IN
+ , rrTTL = soaMinimumTTL soa
+ , rrData = soa
+ }
+
+zoneNSRecord :: Zone -> Maybe SomeRR
+zoneNSRecord zone
+ = do soa <- zoneSOA zone
+ return $ wrapRecord
+ $ ResourceRecord {
+ rrName = zoneName zone
+ , rrType = NS
+ , rrClass = IN
+ , rrTTL = soaMinimumTTL soa
+ , rrData = soaMasterNameServer soa
+ }