propellor spin

This commit is contained in:
Joey Hess 2014-04-13 11:58:22 -04:00
parent 6d12630431
commit 456dd534ce
Failed to extract signature
6 changed files with 219 additions and 182 deletions

View File

@ -1,8 +1,10 @@
module Propellor.Property.File where module Propellor.Property.File where
import Propellor import Propellor
import Utility.FileMode
import System.Posix.Files import System.Posix.Files
import System.PosixCompat.Types
type Line = String type Line = String
@ -12,11 +14,15 @@ f `hasContent` newcontent = fileProperty ("replace " ++ f)
(\_oldcontent -> newcontent) f (\_oldcontent -> newcontent) f
-- | Ensures a file has contents that comes from PrivData. -- | Ensures a file has contents that comes from PrivData.
-- Note: Does not do anything with the permissions of the file to prevent --
-- it from being seen. -- The file's permissions are preserved if the file already existed.
-- Otherwise, they're set to 600.
hasPrivContent :: FilePath -> Property hasPrivContent :: FilePath -> Property
hasPrivContent f = Property ("privcontent " ++ f) $ hasPrivContent f = Property desc $ withPrivData (PrivFile f) $ \privcontent ->
withPrivData (PrivFile f) (\v -> ensureProperty $ f `hasContent` lines v) ensureProperty $ fileProperty' writeFileProtected desc
(\_oldcontent -> lines privcontent) f
where
desc = "privcontent " ++ f
-- | Ensures that a line is present in a file, adding it to the end if not. -- | Ensures that a line is present in a file, adding it to the end if not.
containsLine :: FilePath -> Line -> Property containsLine :: FilePath -> Line -> Property
@ -38,7 +44,9 @@ notPresent f = check (doesFileExist f) $ Property (f ++ " not present") $
makeChange $ nukeFile f makeChange $ nukeFile f
fileProperty :: Desc -> ([Line] -> [Line]) -> FilePath -> Property fileProperty :: Desc -> ([Line] -> [Line]) -> FilePath -> Property
fileProperty desc a f = Property desc $ go =<< liftIO (doesFileExist f) fileProperty = fileProperty' writeFile
fileProperty' :: (FilePath -> String -> IO ()) -> Desc -> ([Line] -> [Line]) -> FilePath -> Property
fileProperty' writer desc a f = Property desc $ go =<< liftIO (doesFileExist f)
where where
go True = do go True = do
ls <- liftIO $ lines <$> readFile f ls <- liftIO $ lines <$> readFile f
@ -46,13 +54,15 @@ fileProperty desc a f = Property desc $ go =<< liftIO (doesFileExist f)
if ls' == ls if ls' == ls
then noChange then noChange
else makeChange $ viaTmp updatefile f (unlines ls') else makeChange $ viaTmp updatefile f (unlines ls')
go False = makeChange $ writeFile f (unlines $ a []) go False = makeChange $ writer f (unlines $ a [])
-- viaTmp makes the temp file mode 600. -- viaTmp makes the temp file mode 600.
-- Replicate the original file mode before moving it into place. -- Replicate the original file's owner and mode.
updatefile f' content = do updatefile f' content = do
writeFile f' content writer f' content
getFileStatus f >>= setFileMode f' . fileMode s <- getFileStatus f
setFileMode f' (fileMode s)
setOwnerAndGroup f' (fileOwner s) (fileGroup s)
-- | Ensures a directory exists. -- | Ensures a directory exists.
dirExists :: FilePath -> Property dirExists :: FilePath -> Property
@ -68,3 +78,9 @@ ownerGroup f owner group = Property (f ++ " owner " ++ og) $ do
else noChange else noChange
where where
og = owner ++ ":" ++ group og = owner ++ ":" ++ group
-- | Ensures that a file/dir has the specfied mode.
mode :: FilePath -> FileMode -> Property
mode f v = Property (f ++ " mode " ++ show v) $ do
liftIO $ modifyFileMode f (\_old -> v)
noChange

View File

@ -4,8 +4,10 @@ import Propellor
import qualified Propellor.Property.File as File import qualified Propellor.Property.File as File
import qualified Propellor.Property.Apt as Apt import qualified Propellor.Property.Apt as Apt
import qualified Propellor.Property.Service as Service import qualified Propellor.Property.Service as Service
import Utility.FileMode
import Data.List import Data.List
import System.Posix.Files
providerFor :: [UserName] -> String -> Property providerFor :: [UserName] -> String -> Property
providerFor users baseurl = propertyList desc $ providerFor users baseurl = propertyList desc $
@ -16,11 +18,18 @@ providerFor users baseurl = propertyList desc $
(map setbaseurl) "/etc/simpleid/config.inc" (map setbaseurl) "/etc/simpleid/config.inc"
] ++ map identfile users ] ++ map identfile users
where where
identfile u = File.hasPrivContent $ concat
[ "/var/lib/simpleid/identities/", u, ".identity" ]
url = "http://"++baseurl++"/simpleid" url = "http://"++baseurl++"/simpleid"
desc = "openid provider " ++ url desc = "openid provider " ++ url
setbaseurl l setbaseurl l
| "SIMPLEID_BASE_URL" `isInfixOf` l = | "SIMPLEID_BASE_URL" `isInfixOf` l =
"define('SIMPLEID_BASE_URL', '"++url++"');" "define('SIMPLEID_BASE_URL', '"++url++"');"
| otherwise = l | otherwise = l
identfile u = combineProperties desc
[ File.hasPrivContent f
-- the identitites directory controls access, so open up
-- file mode
, File.mode f (combineModes (ownerWriteMode:readModes))
]
where
f = concat $ [ "/var/lib/simpleid/identities/", u, ".identity" ]

View File

@ -117,6 +117,7 @@ keyImported keytype user = combineProperties desc
fromKeyType :: SshKeyType -> String fromKeyType :: SshKeyType -> String
fromKeyType SshRsa = "rsa" fromKeyType SshRsa = "rsa"
fromKeyType SshDsa = "dsa" fromKeyType SshDsa = "dsa"
fromKeyType SshEcdsa = "ecdsa"
-- | Puts some host's ssh public key into the known_hosts file for a user. -- | Puts some host's ssh public key into the known_hosts file for a user.
knownHost :: [Host] -> HostName -> UserName -> Property knownHost :: [Host] -> HostName -> UserName -> Property

View File

@ -174,5 +174,5 @@ data PrivDataField
type GpgKeyId = String type GpgKeyId = String
data SshKeyType = SshRsa | SshDsa data SshKeyType = SshRsa | SshDsa | SshEcdsa
deriving (Read, Show, Ord, Eq) deriving (Read, Show, Ord, Eq)

View File

@ -73,6 +73,7 @@ hosts =
& cname "git.kitenet.net" & cname "git.kitenet.net"
& Ssh.hostKey SshDsa & Ssh.hostKey SshDsa
& Ssh.hostKey SshRsa & Ssh.hostKey SshRsa
& Ssh.hostKey SshEcdsa
& Obnam.backup "/srv/git" "33 3 * * *" & Obnam.backup "/srv/git" "33 3 * * *"
[ "--repository=sftp://2318@usw-s002.rsync.net/~/git.kitenet.net" [ "--repository=sftp://2318@usw-s002.rsync.net/~/git.kitenet.net"
, "--encrypt-with=1B169BE1" , "--encrypt-with=1B169BE1"
@ -83,15 +84,20 @@ hosts =
`requires` Ssh.knownHost hosts "usw-s002.rsync.net" "root" `requires` Ssh.knownHost hosts "usw-s002.rsync.net" "root"
`requires` Ssh.authorizedKeys "family" `requires` Ssh.authorizedKeys "family"
`requires` User.accountFor "family" `requires` User.accountFor "family"
& Apt.installed ["git", "git-annex", "rsync"] & Apt.installed ["git", "git-annex", "rsync", "kgb-client"]
& Git.daemonRunning "/srv/git" & Git.daemonRunning "/srv/git"
-- copy wren's ssh host key
-- TODO: upgrade to newer git-annex-shell for notification
-- kgb installation and setup
-- ssh keys for branchable and github repo hooks -- ssh keys for branchable and github repo hooks
-- TODO: upgrade to newer git-annex-shell for notification
-- gitweb -- gitweb
-- downloads.kitenet.net setup (including ssh key to turtle)
& cname "kgb.kitenet.net"
& Apt.serviceInstalledRunning "kbg-bot"
& File.hasPrivContent "/etc/kgb-bot/kgb.conf"
& File.hasPrivContent "/etc/kgb-bot/kgb-client.conf"
& cname "downloads.kitenet.net"
& Apt.buildDep ["git-annex"] `period` Daily & Apt.buildDep ["git-annex"] `period` Daily
-- downloads.kitenet.net setup (including ssh key to turtle)
-- I don't run this system, so only relevant property is its -- I don't run this system, so only relevant property is its
-- public key. -- public key.

View File

@ -1,169 +1,174 @@
-----BEGIN PGP MESSAGE----- -----BEGIN PGP MESSAGE-----
Version: GnuPG v1 Version: GnuPG v1
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
INladqAQRg== RU20bbk3yctGMRu6bxz8KfPJtoeqy58eqDvszhY57OCJAPUXsVtQZSj8G2h2m0cw
=U5Y6 aj5h2EKzZGF1OShmHGRi1lUFo7H8nQGBDbOTAPmBTB1uPswVxIhvtqf4r0EOrmWV
n6P84tbq5i2g7SAqhNxu6NeKmzgzk0l5WW8YnqFYcPCdaIUvqc3E3GtSkWbMSL5T
HamDx1tLtaWAZv7eNhd8H0wjQUSBtcy3mlkiKWam5wSo9hlv3+HRtkLkMrRjeb+2
4h0SSZpwi7uGmMF2QLcmo2w2UcZmYEpfpXuzJPDGMIVqGqtrOzJbsNytauyam138
MFwaR1v3TnVe9JvktHf5qH6ZSotwmHh5qQcTEbY1u3jzMhoizSiS5wOjGc4=
=ncya
-----END PGP MESSAGE----- -----END PGP MESSAGE-----