X-Git-Url: http://www.average.org/gitweb/?p=pdns-pipe-nmc.git;a=blobdiff_plain;f=NmcTransform.hs;h=4a3e66714777d5cfebb81e80a67949e190050753;hp=858acf7de0e6c58229ad7a357e8bb273d66386f4;hb=HEAD;hpb=f5e9870ed6d3307c08e583a7874d8c35e0ea6978 diff --git a/NmcTransform.hs b/NmcTransform.hs index 858acf7..4a3e667 100644 --- a/NmcTransform.hs +++ b/NmcTransform.hs @@ -2,12 +2,12 @@ module NmcTransform ( seedNmcDom , descendNmcDom ) where -import Prelude hiding (lookup) +import Prelude hiding (lookup, null) import Data.ByteString.Lazy (ByteString) -import Data.Text.Lazy (splitOn, pack, unpack) -import Data.Map.Lazy (empty, lookup, delete, size, singleton +import Data.Map.Lazy (Map, empty, lookup, delete, null, singleton , foldrWithKey, insert, insertWith) import Control.Monad (foldM) +import Data.Maybe (fromMaybe) import Data.Aeson (decode) import Data.Default.Class (def) @@ -39,7 +39,7 @@ mergeIncl :: -> IO (Either String NmcDom) -- ^ result with merged import mergeIncl queryOp depth base = do let - mbase = ({-expandSrv .-} splitSubdoms . mergeSelf) base + mbase = mergeSelf base base' = mbase {domDelegate = Nothing, domImport = Nothing} -- print base if depth <= 0 then return $ Left "Nesting of imports is too deep" @@ -63,7 +63,7 @@ mergeSelf base = map = domSubmap base base' = base {domSubmap = removeSelf map} removeSelf Nothing = Nothing - removeSelf (Just map) = if size map' == 0 then Nothing else Just map' + removeSelf (Just map) = if null map' then Nothing else Just map' where map' = delete "" map in case map of @@ -73,62 +73,27 @@ mergeSelf base = Nothing -> base' Just sub -> (mergeSelf sub) `merge` base' -- recursion depth limited by the size of the record -{- --- | replace Service with Srv down in the Map -expandSrv :: NmcDom -> NmcDom -expandSrv base = - let - base' = base { domService = Nothing } - in - case domService base of - Nothing -> base' - Just sl -> foldr addSrvMx base' sl - where - addSrvMx sr acc = sub1 `merge` acc - where - sub1 = def { domSubmap = Just (singleton proto sub2) - , domMx = maybemx} - sub2 = def { domSubmap = Just (singleton srvid sub3) } - sub3 = def { domSrv = Just [srvStr] } - proto = "_" ++ (srvProto sr) - srvid = "_" ++ (srvName sr) - srvStr = (show (srvPrio sr)) ++ "\t" - ++ (show (srvWeight sr)) ++ " " - ++ (show (srvPort sr)) ++ " " - ++ (srvHost sr) - maybemx = - if srvName sr == "smtp" - && srvProto sr == "tcp" - && srvPort sr == 25 - then Just [(show (srvPrio sr)) ++ "\t" ++ (srvHost sr)] - else Nothing --} --- | Convert map elements of the form "subN...sub2.sub1.dom.bit" --- into nested map and merge it -splitSubdoms :: NmcDom -> NmcDom -splitSubdoms base = - let - base' = base { domSubmap = Nothing } - in - case domSubmap base of - Nothing -> base' - Just sdmap -> (def { domSubmap = Just sdmap' }) `merge` base' - where - sdmap' = foldrWithKey stow empty sdmap - stow fqdn sdom acc = insertWith merge fqdn' sdom' acc - where - (fqdn', sdom') = - nest (filter (/= "") (splitOnDots fqdn), sdom) - splitOnDots s = map unpack (splitOn (pack ".") (pack s)) - nest ([], v) = (fqdn, v) -- can split result be empty? - nest ([k], v) = (k, v) - nest (k:ks, v) = - nest (ks, def { domSubmap = Just (singleton k v) }) -- | transfer some elements of `base` into `sub`, notably TLSA propagate :: NmcDom -> NmcDom -> NmcDom -propagate base sub = sub -- FIXME implement it - +propagate base sub = sub `merge` (pickglobals base) + where + pickglobals dom = fromMaybe def (siftsubmap (siftsubmap taketlsa) dom) + siftsubmap f dom = + let + sdmap = fromMaybe empty (domSubmap dom) + sdmap' = foldrWithKey (\k x -> addifjust k (f x)) empty sdmap + addifjust k mdom acc = case mdom of + Nothing -> acc + Just dom -> insert k dom acc -- dups are impossible here + in + if null sdmap' then Nothing else Just $ def { domSubmap = Just sdmap'} + taketlsa dom = case domTlsa dom of + Nothing -> Nothing + Just tlsa -> case filter (\x -> tlsIncSubdoms x) tlsa of + [] -> Nothing + tlsa' -> Just $ def { domTlsa = Just tlsa' } + -- | Presence of some elements require removal of some others normalizeDom :: NmcDom -> NmcDom normalizeDom dom = foldr id dom [ translateNormalizer