split out Property.FIle
This commit is contained in:
parent
e741b7b82e
commit
8e7b296e82
|
@ -1,5 +1,6 @@
|
||||||
import Property
|
import Property
|
||||||
import HostName
|
import HostName
|
||||||
|
import qualified Property.File as File
|
||||||
import qualified Property.Apt as Apt
|
import qualified Property.Apt as Apt
|
||||||
import qualified Property.Ssh as Ssh
|
import qualified Property.Ssh as Ssh
|
||||||
import qualified Property.User as User
|
import qualified Property.User as User
|
||||||
|
@ -47,7 +48,7 @@ standardSystem suite = propertyList "standard system"
|
||||||
, User.nonsystem "joey"
|
, User.nonsystem "joey"
|
||||||
, Apt.installed ["sudo"]
|
, Apt.installed ["sudo"]
|
||||||
-- nopasswd because no password is set up for joey.
|
-- nopasswd because no password is set up for joey.
|
||||||
, lineInFile "/etc/sudoers" "joey ALL=(ALL:ALL) NOPASSWD:ALL"
|
, "/etc/sudoers" `File.containsLine` "joey ALL=(ALL:ALL) NOPASSWD:ALL"
|
||||||
, GitHome.installedFor "joey"
|
, GitHome.installedFor "joey"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
19
Property.hs
19
Property.hs
|
@ -127,25 +127,6 @@ cmdProperty' cmd params env = CmdProperty desc cmd params env
|
||||||
showp (Param s) = s
|
showp (Param s) = s
|
||||||
showp (File s) = s
|
showp (File s) = s
|
||||||
|
|
||||||
{- Replaces all the content of a file. -}
|
|
||||||
fileHasContent :: FilePath -> [Line] -> Property
|
|
||||||
fileHasContent f newcontent = FileProperty ("replace " ++ f)
|
|
||||||
f (\_oldcontent -> newcontent)
|
|
||||||
|
|
||||||
{- Ensures that a line is present in a file, adding it to the end if not. -}
|
|
||||||
lineInFile :: FilePath -> Line -> Property
|
|
||||||
lineInFile f l = FileProperty (f ++ " contains:" ++ l) f go
|
|
||||||
where
|
|
||||||
go ls
|
|
||||||
| l `elem` ls = ls
|
|
||||||
| otherwise = ls++[l]
|
|
||||||
|
|
||||||
{- Ensures that a line is not present in a file.
|
|
||||||
- Note that the file is ensured to exist, so if it doesn't, an empty
|
|
||||||
- file will be written. -}
|
|
||||||
lineNotInFile :: FilePath -> Line -> Property
|
|
||||||
lineNotInFile f l = FileProperty (f ++ " remove: " ++ l) f (filter (/= l))
|
|
||||||
|
|
||||||
{- Makes a perhaps non-idempotent Property be idempotent by using a flag
|
{- Makes a perhaps non-idempotent Property be idempotent by using a flag
|
||||||
- file to indicate whether it has run before.
|
- file to indicate whether it has run before.
|
||||||
- Use with caution. -}
|
- Use with caution. -}
|
||||||
|
|
|
@ -7,6 +7,7 @@ import System.IO
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
|
|
||||||
import Property
|
import Property
|
||||||
|
import qualified Property.File as File
|
||||||
import Utility.SafeCommand
|
import Utility.SafeCommand
|
||||||
import Utility.Process
|
import Utility.Process
|
||||||
|
|
||||||
|
@ -47,7 +48,7 @@ stdSourcesList :: Suite -> Property
|
||||||
stdSourcesList = setSourcesList . debCdn
|
stdSourcesList = setSourcesList . debCdn
|
||||||
|
|
||||||
setSourcesList :: [Line] -> Property
|
setSourcesList :: [Line] -> Property
|
||||||
setSourcesList ls = fileHasContent sourcesList ls `onChange` update
|
setSourcesList ls = sourcesList `File.hasContent` ls `onChange` update
|
||||||
|
|
||||||
runApt :: [CommandParam] -> Property
|
runApt :: [CommandParam] -> Property
|
||||||
runApt ps = cmdProperty' "apt-get" ps env
|
runApt ps = cmdProperty' "apt-get" ps env
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
module Property.File where
|
||||||
|
|
||||||
|
import Property
|
||||||
|
|
||||||
|
{- Replaces all the content of a file. -}
|
||||||
|
hasContent :: FilePath -> [Line] -> Property
|
||||||
|
f `hasContent` newcontent = FileProperty ("replace " ++ f)
|
||||||
|
f (\_oldcontent -> newcontent)
|
||||||
|
|
||||||
|
{- Ensures that a line is present in a file, adding it to the end if not. -}
|
||||||
|
containsLine :: FilePath -> Line -> Property
|
||||||
|
f `containsLine` l = FileProperty (f ++ " contains:" ++ l) f go
|
||||||
|
where
|
||||||
|
go ls
|
||||||
|
| l `elem` ls = ls
|
||||||
|
| otherwise = ls++[l]
|
||||||
|
|
||||||
|
{- Ensures that a line is not present in a file.
|
||||||
|
- Note that the file is ensured to exist, so if it doesn't, an empty
|
||||||
|
- file will be written. -}
|
||||||
|
lacksLine :: FilePath -> Line -> Property
|
||||||
|
f `lacksLine` l = FileProperty (f ++ " remove: " ++ l) f (filter (/= l))
|
|
@ -1,11 +1,11 @@
|
||||||
module Property.Hostname where
|
module Property.Hostname where
|
||||||
|
|
||||||
import Property
|
import Property
|
||||||
|
import qualified Property.File as File
|
||||||
import Utility.SafeCommand
|
import Utility.SafeCommand
|
||||||
|
|
||||||
type HostName = String
|
type HostName = String
|
||||||
|
|
||||||
set :: HostName -> Property
|
set :: HostName -> Property
|
||||||
set hostname =
|
set hostname = "/etc/hostname" `File.hasContent` [hostname]
|
||||||
fileHasContent "/etc/hostname" [hostname]
|
|
||||||
`onChange` cmdProperty "hostname" [Param hostname]
|
`onChange` cmdProperty "hostname" [Param hostname]
|
||||||
|
|
|
@ -6,6 +6,7 @@ import System.FilePath
|
||||||
|
|
||||||
import Property
|
import Property
|
||||||
import Property.User
|
import Property.User
|
||||||
|
import qualified Property.File as File
|
||||||
import Utility.SafeCommand
|
import Utility.SafeCommand
|
||||||
import Utility.Exception
|
import Utility.Exception
|
||||||
|
|
||||||
|
@ -18,8 +19,8 @@ sshdConfig = "/etc/ssh/sshd_config"
|
||||||
|
|
||||||
setSshdConfig :: String -> Bool -> Property
|
setSshdConfig :: String -> Bool -> Property
|
||||||
setSshdConfig setting allowed = combineProperties desc
|
setSshdConfig setting allowed = combineProperties desc
|
||||||
[ lineNotInFile sshdConfig $ sshline (not allowed)
|
[ sshdConfig `File.lacksLine` (sshline $ not allowed)
|
||||||
, lineInFile sshdConfig $ sshline allowed
|
, sshdConfig `File.containsLine` (sshline allowed)
|
||||||
] `onChange` restartSshd
|
] `onChange` restartSshd
|
||||||
where
|
where
|
||||||
desc = unwords [ "ssh config:", setting, sshBool allowed ]
|
desc = unwords [ "ssh config:", setting, sshBool allowed ]
|
||||||
|
|
|
@ -2,12 +2,13 @@ module Property.Tor where
|
||||||
|
|
||||||
import Property
|
import Property
|
||||||
import Utility.SafeCommand
|
import Utility.SafeCommand
|
||||||
|
import qualified Property.File as File
|
||||||
import qualified Property.Apt as Apt
|
import qualified Property.Apt as Apt
|
||||||
|
|
||||||
isBridge :: Property
|
isBridge :: Property
|
||||||
isBridge = setup `requires` Apt.installed ["tor"]
|
isBridge = setup `requires` Apt.installed ["tor"]
|
||||||
where
|
where
|
||||||
setup = fileHasContent "/etc/tor/torrc"
|
setup = "/etc/tor/torrc" `File.hasContent`
|
||||||
[ "SocksPort 0"
|
[ "SocksPort 0"
|
||||||
, "ORPort 443"
|
, "ORPort 443"
|
||||||
, "BridgeRelay 1"
|
, "BridgeRelay 1"
|
||||||
|
|
Loading…
Reference in New Issue