summaryrefslogtreecommitdiff
path: root/src/Propellor
diff options
context:
space:
mode:
Diffstat (limited to 'src/Propellor')
-rw-r--r--src/Propellor/Property/Dns.hs23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/Propellor/Property/Dns.hs b/src/Propellor/Property/Dns.hs
index c89ce271..8e38a75e 100644
--- a/src/Propellor/Property/Dns.hs
+++ b/src/Propellor/Property/Dns.hs
@@ -322,17 +322,32 @@ rValue (SSHFP x y s) = Just $ unwords
, s
]
rValue (INCLUDE f) = Just f
-rValue (TXT s) = Just $ [op] ++ [w]
- ++ (intercalate "\n\t" $
+rValue (TXT s) = Just $ zoneFileString s
+ where
+ op = '('
+ cp = ')'
+ w = ' '
+ q = '"'
+rValue (PTR _) = Nothing
+
+-- Bind has a limit on the length of a string in its zone file,
+-- but a string can be split into sections that are glued together
+-- inside parens to configure a longer value.
+--
+-- This adds quotes around each substring.
+zoneFileString :: String -> String
+zoneFileString s = concat
+ [ [op, w]
+ , (intercalate "\n\t" $
map (\x -> [q] ++ filter (/= q) x ++ [q]) $
Split.chunksOf 255 s)
- ++ [w] ++ [cp]
+ , [w, cp]
+ ]
where
op = '('
cp = ')'
w = ' '
q = '"'
-rValue (PTR _) = Nothing
-- | Adjusts the serial number of the zone to always be larger
-- than the serial number in the Zone record,