48 lines
1.3 KiB
Haskell
48 lines
1.3 KiB
Haskell
|
{-# LANGUAGE PackageImports #-}
|
||
|
|
||
|
module Propellor.Attr where
|
||
|
|
||
|
import Propellor.Types
|
||
|
import Propellor.Types.Attr
|
||
|
|
||
|
import "mtl" Control.Monad.Reader
|
||
|
import qualified Data.Set as S
|
||
|
import qualified Data.Map as M
|
||
|
|
||
|
pureAttrProperty :: Desc -> (Attr -> Attr) -> AttrProperty
|
||
|
pureAttrProperty desc = AttrProperty $ Property ("has " ++ desc)
|
||
|
(return NoChange)
|
||
|
|
||
|
hostname :: HostName -> AttrProperty
|
||
|
hostname name = pureAttrProperty ("hostname " ++ name) $
|
||
|
\d -> d { _hostname = name }
|
||
|
|
||
|
getHostName :: Propellor HostName
|
||
|
getHostName = asks _hostname
|
||
|
|
||
|
cname :: Domain -> AttrProperty
|
||
|
cname domain = pureAttrProperty ("cname " ++ domain) (addCName domain)
|
||
|
|
||
|
cnameFor :: IsProp p => Domain -> (Domain -> p) -> AttrProperty
|
||
|
cnameFor domain mkp =
|
||
|
let p = mkp domain
|
||
|
in AttrProperty p (addCName domain)
|
||
|
|
||
|
addCName :: HostName -> Attr -> Attr
|
||
|
addCName domain d = d { _cnames = S.insert domain (_cnames d) }
|
||
|
|
||
|
hostnameless :: Attr
|
||
|
hostnameless = newAttr (error "hostname Attr not specified")
|
||
|
|
||
|
hostAttr :: Host -> Attr
|
||
|
hostAttr (Host _ mkattrs) = mkattrs hostnameless
|
||
|
|
||
|
hostProperties :: Host -> [Property]
|
||
|
hostProperties (Host ps _) = ps
|
||
|
|
||
|
hostMap :: [Host] -> M.Map HostName Host
|
||
|
hostMap l = M.fromList $ zip (map (_hostname . hostAttr) l) l
|
||
|
|
||
|
findHost :: [Host] -> HostName -> Maybe Host
|
||
|
findHost l hn = M.lookup hn (hostMap l)
|