{-# OPTIONS_GHC -fno-warn-duplicate-exports #-} -- | When propellor runs on a Host, it ensures that its Properties -- are satisfied, taking action as necessary when a Property is not -- currently satisfied. -- -- A simple propellor program example: -- -- > import Propellor -- > import qualified Propellor.Property.File as File -- > import qualified Propellor.Property.Apt as Apt -- > -- > main :: IO () -- > main = defaultMain hosts -- > -- > hosts :: [Host] -- > hosts = [example] -- > -- > example :: Host -- > example = host "example.com" $ props -- > & Apt.installed ["mydaemon"] -- > & "/etc/mydaemon.conf" `File.containsLine` "secure=1" -- > `onChange` cmdProperty "service" ["mydaemon", "restart"] -- > ! Apt.installed ["unwantedpackage"] -- -- See config.hs for a more complete example, and clone Propellor's -- git repository for a deployable system using Propellor: -- git clone module Propellor ( -- * Core data types Host(..) , Property , RevertableProperty , module Propellor.Types -- * Config file , defaultMain , host , (&) , (!) -- * Propertries -- | Properties are often combined together in your propellor -- configuration. For example: -- -- > "/etc/foo/config" `File.containsLine` "bar=1" -- > `requires` File.dirExists "/etc/foo" , requires , before , onChange , describe , module Propellor.Property -- | Everything you need to build your own properties, -- and useful property combinators , module Propellor.Property.Cmd -- | Properties to run shell commands , module Propellor.Info -- | Properties that set `Info` , module Propellor.Property.List -- | Combining a list of properties into a single property , module Propellor.Types.PrivData -- | Private data access for properties , module X ) where import Propellor.Types import Propellor.CmdLine (defaultMain) import Propellor.Property import Propellor.Property.List import Propellor.Property.Cmd import Propellor.Types.PrivData import Propellor.Info import Propellor.PropAccum import Data.Monoid as X import Data.String as X (fromString)