module Propellor.Property.Locale where
import Propellor.Base
import Propellor.Property.File
import Data.List (isPrefixOf)
type Locale = String
type LocaleVariable = String
selectedFor :: Locale -> [LocaleVariable] -> RevertableProperty DebianLike DebianLike
locale `selectedFor` vars = select <!> deselect
where
select = tightenTargets $
check (not <$> isselected)
(cmdProperty "update-locale" selectArgs)
`requires` available locale
`describe` (locale ++ " locale selected")
deselect = tightenTargets $
check isselected (cmdProperty "update-locale" vars)
`describe` (locale ++ " locale deselected")
selectArgs = zipWith (++) vars (repeat ('=':locale))
isselected = locale `isSelectedFor` vars
isSelectedFor :: Locale -> [LocaleVariable] -> IO Bool
locale `isSelectedFor` vars = do
ls <- catchDefaultIO [] $ lines <$> readFile "/etc/default/locale"
return $ and $ map (\v -> v ++ "=" ++ locale `elem` ls) vars
available :: Locale -> RevertableProperty DebianLike DebianLike
available locale = ensureAvailable <!> ensureUnavailable
where
f = "/etc/locale.gen"
desc = (locale ++ " locale generated")
ensureAvailable :: Property DebianLike
ensureAvailable = property' desc $ \w -> do
locales <- lines <$> (liftIO $ readFile f)
if locale `presentIn` locales
then ensureProperty w $
fileProperty desc (foldr uncomment []) f
`onChange` regenerate
else return FailedChange
ensureUnavailable :: Property DebianLike
ensureUnavailable = tightenTargets $
fileProperty (locale ++ " locale not generated") (foldr comment []) f
`onChange` regenerate
uncomment l ls =
if ("# " ++ locale) `isPrefixOf` l
then drop 2 l : ls
else l:ls
comment l ls =
if locale `isPrefixOf` l
then ("# " ++ l) : ls
else l:ls
l `presentIn` ls = any (l `isPrefix`) ls
l `isPrefix` x = (l `isPrefixOf` x) || (("# " ++ l) `isPrefixOf` x)
regenerate = cmdProperty "locale-gen" []
`assume` MadeChange