X-Git-Url: http://www.average.org/gitweb/?p=pdns-pipe-nmc.git;a=blobdiff_plain;f=NmcTransform.hs;h=23244a554aa9c25803cbf18b473275b29c7526bb;hp=d9a98d00459a595e05bc0850f9afd43ca8b386cf;hb=92504303416dfc46f1a4e4ed45ddd3203919cf8f;hpb=978ad2816267da813a6984a83035bc73fb293a17 diff --git a/NmcTransform.hs b/NmcTransform.hs index d9a98d0..23244a5 100644 --- a/NmcTransform.hs +++ b/NmcTransform.hs @@ -4,7 +4,6 @@ module NmcTransform ( seedNmcDom import Prelude hiding (lookup) import Data.ByteString.Lazy (ByteString) -import Data.Text.Lazy (splitOn, pack, unpack) import Data.Map.Lazy (empty, lookup, delete, size, singleton , foldrWithKey, insert, insertWith) import Control.Monad (foldM) @@ -39,7 +38,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" @@ -74,31 +73,12 @@ 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 -- FIXME must do this on the map elements, not on the top level + pickglobals dom = def { domTlsa = fmap pickforcedtls (domTlsa dom) } + pickforcedtls = filter (\x -> tlsIncSubdoms x) -- | Presence of some elements require removal of some others normalizeDom :: NmcDom -> NmcDom