X-Git-Url: http://www.average.org/gitweb/?p=pdns-pipe-nmc.git;a=blobdiff_plain;f=NmcTransform.hs;h=4a3e66714777d5cfebb81e80a67949e190050753;hp=d9a98d00459a595e05bc0850f9afd43ca8b386cf;hb=HEAD;hpb=978ad2816267da813a6984a83035bc73fb293a17 diff --git a/NmcTransform.hs b/NmcTransform.hs index d9a98d0..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 = (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 @@ -74,32 +74,26 @@ mergeSelf base = Just sub -> (mergeSelf sub) `merge` base' -- recursion depth limited by the size of the record --- | 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