module Network.DNS.Named.Zone
- ( Zone(..)
- , ZoneFinder(..)
+ ( ZoneFinder(..)
+ , fromZones
- , defaultRootZone
+ , Zone(..)
+ , isInZone
+
+ , zoneSOARecord
+ , zoneNSRecord
)
where
import Data.Maybe
import Network.DNS.Message
-import Network.DNS.Named.Responder
-
+import Network.DNS.DomainMap
-data Zone
- = Zone {
- zoneName :: !DomainName
- , zoneResponders :: ![SomeResponder]
- }
class ZoneFinder a where
- findZone :: a -> DomainName -> IO Zone
+ findZone :: a -> DomainName -> IO (Maybe Zone)
-instance ZoneFinder (DomainName -> Zone) where
- findZone = (return .)
+instance ZoneFinder (DomainMap Zone) where
+ findZone = (return .) . flip nearest
-instance ZoneFinder (DomainName -> IO Zone) where
- findZone = id
+instance ZoneFinder (IO (DomainMap Zone)) where
+ findZone = flip (fmap . nearest)
instance ZoneFinder (DomainName -> Maybe Zone) where
- findZone = ((return . fromMaybe defaultRootZone) .)
+ findZone = (return .)
instance ZoneFinder (DomainName -> IO (Maybe Zone)) where
- findZone = (fmap (fromMaybe defaultRootZone) .)
+ findZone = id
+
+
+fromZones :: [Zone] -> DomainMap Zone
+fromZones = fromList . map toPair
+ where
+ toPair z = (zoneName z, z)
+
+
+data Zone
+ = Zone {
+ zoneName :: !DomainName
+ , zoneSOA :: !(Maybe SOAFields)
+ , zoneRecordNames :: !(IO [DomainName])
+ , zoneResponder :: !(DomainName -> IO [SomeRR])
+ }
+
+isInZone :: DomainName -> Zone -> Bool
+isInZone name zone = zoneName zone `isZoneOf` name
+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
+ }
-defaultRootZone :: Zone
-defaultRootZone = error "FIXME: defaultRootZone is not implemented yet"
\ No newline at end of file
+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
+ }