From 29600a2c67a586849b232b0173ff019e4b601083 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 12 Apr 2014 20:21:33 -0400 Subject: [PATCH 01/70] propellor spin --- Propellor/Property/Git.hs | 36 ++++++++++++++++++++++++++++++++++++ config-joey.hs | 10 ++-------- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/Propellor/Property/Git.hs b/Propellor/Property/Git.hs index c049416..6f3c036 100644 --- a/Propellor/Property/Git.hs +++ b/Propellor/Property/Git.hs @@ -4,6 +4,7 @@ import Propellor import Propellor.Property.File import qualified Propellor.Property.Apt as Apt import qualified Propellor.Property.Service as Service +import Utility.SafeCommand import Data.List @@ -46,3 +47,38 @@ daemonRunning exportdir = RevertableProperty setup unsetup , "--base-path=" ++ exportdir , exportdir ] + +installed :: Property +installed = Apt.installed ["git"] + +type RepoUrl = String + +type Branch = String + +-- | Specified git repository is cloned to the specified directory. +-- +-- If the firectory exists with some other content, it will be recursively +-- deleted. +-- +-- A branch can be specified, to check out. +cloned :: UserName -> RepoUrl -> FilePath -> Maybe Branch -> Property +cloned owner url dir mbranch = check originurl (Property desc checkout) + `requires` installed + where + desc = "git cloned " ++ url ++ " " ++ dir + gitconfig = dir ".git/config" + originurl = ifM (doesFileExist gitconfig) + ( do + v <- catchDefaultIO Nothing $ headMaybe . lines <$> + readProcess "git" ["config", "--file", gitconfig, "remote.origin.url"] + return (v /= Just url) + , return True + ) + checkout = do + liftIO $ whenM (doesDirectoryExist dir) $ + removeDirectoryRecursive dir + ensureProperty $ userScriptProperty owner $ catMaybes + [ Just $ "git clone " ++ shellEscape url ++ " " ++ shellEscape dir + , Just $ "cd " ++ shellEscape dir + , ("git checkout " ++) <$> mbranch + ] diff --git a/config-joey.hs b/config-joey.hs index 8a58545..2efb81c 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -104,14 +104,8 @@ hosts = , standardContainer "ancient-kitenet" Stable "amd64" & Docker.publish "1994:80" & Apt.serviceInstalledRunning "apache2" - & Apt.installed ["git"] - & scriptProperty - [ "cd /var/" - , "rm -rf www" - , "git clone git://git.kitenet.net/kitewiki www" - , "cd www" - , "git checkout remotes/origin/old-kitenet.net" - ] `flagFile` "/var/www/blastfromthepast.html" + & Git.cloned "root" "git://git.kitenet.net/kitewiki" "/var/www" + (Just "remotes/origin/old-kitenet.net") -- git-annex autobuilder containers , gitAnnexBuilder "amd64" 15 From 0e02fb31dc830b1c8d50ca8fe6bc7e4ee86a95a5 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 12 Apr 2014 20:21:54 -0400 Subject: [PATCH 02/70] propellor spin From 39ea83ea2416cf67d3f837cc564472ffbef136f2 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 12 Apr 2014 20:22:19 -0400 Subject: [PATCH 03/70] propellor spin From 6075fc636dfd9d8c946ed11a58ffa7059dd560d0 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 12 Apr 2014 21:34:25 -0400 Subject: [PATCH 04/70] propellor spin --- Propellor/Property.hs | 16 ++++++++++----- Propellor/Property/Git.hs | 2 +- Propellor/Property/Gpg.hs | 41 +++++++++++++++++++++++++++++++++++++++ Propellor/Property/Ssh.hs | 27 +++++++++++++++++++++++++- Propellor/Types.hs | 8 +++++++- config-joey.hs | 17 +++++++++------- propellor.cabal | 1 + 7 files changed, 97 insertions(+), 15 deletions(-) create mode 100644 Propellor/Property/Gpg.hs diff --git a/Propellor/Property.hs b/Propellor/Property.hs index 83e19a7..3e41fbc 100644 --- a/Propellor/Property.hs +++ b/Propellor/Property.hs @@ -12,6 +12,7 @@ import Propellor.Types import Propellor.Types.Attr import Propellor.Engine import Utility.Monad +import System.FilePath makeChange :: IO () -> Propellor Result makeChange a = liftIO a >> return MadeChange @@ -52,14 +53,19 @@ p1 `before` p2 = Property (propertyDesc p1) $ do -- file to indicate whether it has run before. -- Use with caution. flagFile :: Property -> FilePath -> Property -flagFile property flagfile = Property (propertyDesc property) $ - go =<< liftIO (doesFileExist flagfile) +flagFile property = flagFile' property . return + +flagFile' :: Property -> IO FilePath -> Property +flagFile' property getflagfile = Property (propertyDesc property) $ do + flagfile <- liftIO getflagfile + go flagfile =<< liftIO (doesFileExist flagfile) where - go True = return NoChange - go False = do + go _ True = return NoChange + go flagfile False = do r <- ensureProperty property when (r == MadeChange) $ liftIO $ - unlessM (doesFileExist flagfile) $ + unlessM (doesFileExist flagfile) $ do + createDirectoryIfMissing True (takeDirectory flagfile) writeFile flagfile "" return r diff --git a/Propellor/Property/Git.hs b/Propellor/Property/Git.hs index 6f3c036..6541dc7 100644 --- a/Propellor/Property/Git.hs +++ b/Propellor/Property/Git.hs @@ -65,7 +65,7 @@ cloned :: UserName -> RepoUrl -> FilePath -> Maybe Branch -> Property cloned owner url dir mbranch = check originurl (Property desc checkout) `requires` installed where - desc = "git cloned " ++ url ++ " " ++ dir + desc = "git cloned " ++ url ++ " to " ++ dir gitconfig = dir ".git/config" originurl = ifM (doesFileExist gitconfig) ( do diff --git a/Propellor/Property/Gpg.hs b/Propellor/Property/Gpg.hs new file mode 100644 index 0000000..e23111b --- /dev/null +++ b/Propellor/Property/Gpg.hs @@ -0,0 +1,41 @@ +module Propellor.Property.Gpg where + +import Propellor +import qualified Propellor.Property.Apt as Apt +import Utility.FileSystemEncoding + +import System.PosixCompat + +installed :: Property +installed = Apt.installed ["gnupg"] + +-- | Sets up a user with a gpg key from the privdata. +-- +-- Note that if a secret key is exported using gpg -a --export-secret-key, +-- the public key is also included. Or just a public key could be +-- exported, and this would set it up just as well. +-- +-- Recommend only using this for low-value dedicated role keys. +-- No attempt has been made to scrub the key out of memory once it's used. +-- +-- The GpgKeyId does not have to be a numeric id; it can just as easily +-- be a description of the key. +keyImported :: GpgKeyId -> UserName -> Property +keyImported keyid user = flagFile' (Property desc go) genflag + `requires` installed + where + desc = user ++ " has gpg key " ++ show keyid + genflag = do + d <- dotDir user + return $ d ".propellor-imported-keyid-" ++ keyid + go = withPrivData (GpgKey keyid) $ \key -> makeChange $ + withHandle StdinHandle createProcessSuccess + (proc "su" ["-c", "gpg --import", user]) $ \h -> do + fileEncoding h + hPutStr h key + hClose h + +dotDir :: UserName -> IO FilePath +dotDir user = do + home <- homeDirectory <$> getUserEntryForName user + return $ home ".gnupg" diff --git a/Propellor/Property/Ssh.hs b/Propellor/Property/Ssh.hs index 59845f8..4280935 100644 --- a/Propellor/Property/Ssh.hs +++ b/Propellor/Property/Ssh.hs @@ -4,13 +4,17 @@ module Propellor.Property.Ssh ( passwordAuthentication, hasAuthorizedKeys, restartSshd, - uniqueHostKeys + uniqueHostKeys, + keyImported ) where import Propellor import qualified Propellor.Property.File as File import Propellor.Property.User import Utility.SafeCommand +import Utility.FileMode + +import System.PosixCompat sshBool :: Bool -> String sshBool True = "yes" @@ -60,3 +64,24 @@ uniqueHostKeys = flagFile prop "/etc/ssh/.unique_host_keys" ensureProperty $ cmdProperty "/var/lib/dpkg/info/openssh-server.postinst" ["configure"] + +-- | Sets up a user with a ssh private key from the site's privdata. +-- +-- The ssh public key (.pub) is not installed. Ssh does not use it. +keyImported :: SshKeyType -> UserName -> Property +keyImported keytype user = Property desc install + where + desc = user ++ " has ssh key" + install = do + f <- liftIO keyfile + ifM (liftIO $ doesFileExist f) + ( noChange + , withPrivData (SshKey keytype user) $ \key -> makeChange $ + writeFileProtected f key + ) + keyfile = do + home <- homeDirectory <$> getUserEntryForName user + return $ home ".ssh" "id_" ++ + case keytype of + SshRsa -> "rsa" + SshDsa -> "dsa" diff --git a/Propellor/Types.hs b/Propellor/Types.hs index e6e0212..a30b183 100644 --- a/Propellor/Types.hs +++ b/Propellor/Types.hs @@ -27,6 +27,8 @@ module Propellor.Types , ActionResult(..) , CmdLine(..) , PrivDataField(..) + , GpgKeyId + , SshKeyType(..) ) where import Data.Monoid @@ -162,9 +164,13 @@ data CmdLine -- It's fine to add new fields. data PrivDataField = DockerAuthentication - | SshPrivKey UserName + | SshKey SshKeyType UserName | Password UserName | PrivFile FilePath + | GpgKey GpgKeyId deriving (Read, Show, Ord, Eq) +type GpgKeyId = String +data SshKeyType = SshRsa | SshDsa + deriving (Read, Show, Ord, Eq) diff --git a/config-joey.hs b/config-joey.hs index 2efb81c..7403f87 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -17,6 +17,7 @@ import qualified Propellor.Property.Dns as Dns import qualified Propellor.Property.OpenId as OpenId import qualified Propellor.Property.Docker as Docker import qualified Propellor.Property.Git as Git +import qualified Propellor.Property.Gpg as Gpg import qualified Propellor.Property.SiteSpecific.GitHome as GitHome import qualified Propellor.Property.SiteSpecific.GitAnnexBuilder as GitAnnexBuilder import qualified Propellor.Property.SiteSpecific.JoeySites as JoeySites @@ -71,6 +72,8 @@ hosts = & Apt.buildDep ["git-annex"] `period` Daily & Git.daemonRunning "/srv/git" & File.ownerGroup "/srv/git" "joey" "joey" + & Gpg.keyImported "git.kitenet.net obnam backup key" "root" + & Ssh.keyImported SshRsa "root" -- git repos restore (how?) (also make backups!) -- family annex needs family members to have accounts, -- ssh host key etc.. finesse? @@ -80,13 +83,13 @@ hosts = -- gitweb -- downloads.kitenet.net setup (including ssh key to turtle) - --' __|II| ,. ----- __|II|II|__ ( \_,/\ ------'\o/-'-.-'-.-'-.- __|II|II|II|II|___/ __/ -'-.-'-.-'-.-'-.-'- ---------------------- | [Docker] / ---------------------- ---------------------- : / ----------------------- ----------------------- \____, o ,' ------------------------ ------------------------ '--,___________,' ------------------------- + --' __|II| ,. + ---- __|II|II|__ ( \_,/\ + ------'\o/-'-.-'-.-'-.- __|II|II|II|II|___/ __/ -'-.-'-.-'-.-'-.-'- + ----------------------- | [Docker] / ---------------------- + ----------------------- : / ----------------------- + ------------------------ \____, o ,' ------------------------ + ------------------------- '--,___________,' ------------------------- -- Simple web server, publishing the outside host's /var/www , standardContainer "webserver" Stable "amd64" diff --git a/propellor.cabal b/propellor.cabal index 5497cc6..b28a26d 100644 --- a/propellor.cabal +++ b/propellor.cabal @@ -76,6 +76,7 @@ Library Propellor.Property.Docker Propellor.Property.File Propellor.Property.Git + Propellor.Property.Gpg Propellor.Property.Network Propellor.Property.OpenId Propellor.Property.Reboot From 967a0d82dd84a2adfabe702d8ca030d30f8079b5 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 12 Apr 2014 21:43:30 -0400 Subject: [PATCH 05/70] propellor spin --- Propellor/Property/Ssh.hs | 20 +++++++++++--------- Propellor/Types.hs | 3 ++- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Propellor/Property/Ssh.hs b/Propellor/Property/Ssh.hs index 4280935..51649fd 100644 --- a/Propellor/Property/Ssh.hs +++ b/Propellor/Property/Ssh.hs @@ -66,22 +66,24 @@ uniqueHostKeys = flagFile prop "/etc/ssh/.unique_host_keys" ["configure"] -- | Sets up a user with a ssh private key from the site's privdata. --- --- The ssh public key (.pub) is not installed. Ssh does not use it. keyImported :: SshKeyType -> UserName -> Property -keyImported keytype user = Property desc install +keyImported keytype user = propertyList desc + [ Property desc (install (SshPubKey keytype user) ".pub") + , Property desc (install (SshPrivKey keytype user) "") + ] where desc = user ++ " has ssh key" - install = do - f <- liftIO keyfile + install p ext = do + f <- liftIO $ keyfile ext ifM (liftIO $ doesFileExist f) ( noChange - , withPrivData (SshKey keytype user) $ \key -> makeChange $ + , withPrivData p $ \key -> makeChange $ writeFileProtected f key ) - keyfile = do + keyfile ext = do home <- homeDirectory <$> getUserEntryForName user - return $ home ".ssh" "id_" ++ - case keytype of + return $ home ".ssh" "id_" + ++ case keytype of SshRsa -> "rsa" SshDsa -> "dsa" + ++ ext diff --git a/Propellor/Types.hs b/Propellor/Types.hs index a30b183..86c56a2 100644 --- a/Propellor/Types.hs +++ b/Propellor/Types.hs @@ -164,7 +164,8 @@ data CmdLine -- It's fine to add new fields. data PrivDataField = DockerAuthentication - | SshKey SshKeyType UserName + | SshPubKey SshKeyType UserName + | SshPrivKey SshKeyType UserName | Password UserName | PrivFile FilePath | GpgKey GpgKeyId From 42a2baf8d55f3a6865b3a830d55ddc76381ddbe6 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 12 Apr 2014 21:45:51 -0400 Subject: [PATCH 06/70] propellor spin From 5c05dded837d4007076d7815ac0bf6cd8751766a Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 12 Apr 2014 21:46:44 -0400 Subject: [PATCH 07/70] propellor spin From 7a23037c7e2c2db004e819f3b5db2287cea42a1b Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 12 Apr 2014 21:49:19 -0400 Subject: [PATCH 08/70] propellor spin --- privdata/diatom.kitenet.net.gpg | 92 +++++++++++++++++++++++++++------ 1 file changed, 77 insertions(+), 15 deletions(-) diff --git a/privdata/diatom.kitenet.net.gpg b/privdata/diatom.kitenet.net.gpg index 7c36ab2..b6508ba 100644 --- a/privdata/diatom.kitenet.net.gpg +++ b/privdata/diatom.kitenet.net.gpg @@ -1,19 +1,81 @@ -----BEGIN PGP MESSAGE----- Version: GnuPG v1 -hQIMA7ODiaEXBlRZAQ//Qsi46/S4X9qWNSCqFUuUOdoKnuOro0SIKfR19Z0SlseL -AH5cPWUX2eIFA3tzku5Psm8enxGc2jyMhfS5KQkVMLoV/SdgLTEfbsF2TkOGUIFf -AMEt+HOPercftwzU+KnwyNJ6kfCinlgmehLwAHLvD8HfzsL9lD59dJGkYQ61cDZ8 -NQSOJwbLVzlXGoMjUcQ6ihmg7gOEGptO7F+p4oamOYwpzibaFGX2BsczMRDcjlGY -B+ufxINqj2bV17lHchNs/Je8uF5Owe+5zoK2cf6TTCdtlIcWjuw6YIMUPWHhIx3C -DCrEFS/rOJCyY+M8CwIfqS0JTJVNIKJfhP8LbbaoyRyXB2XF2eLM1bQ25p//fpav -+MRQ/0SqnGXYV7ZQE/a+/dESi8/u2yua1m1DBwXzAp468pCTaZCm9gwV+D9Ggsbr -uCU5K/cTa7wPyzfYtki0jkM+R1uk1HqWuHHt0/CD1VnDM3Zrj2JVkoE+pR1LhiSH -qKj8/zF935QmGrCUUjo+1bBn20BDiiFPiiPo4KN3At2uK4qQo1F0c+JUQUHGKV9r -O/c4v0dhPj/Qq5kSp5higO8n2Afv68wAfCWBkBo6SpCS7nuR7xvLWD7pWBTS/0BG -BcL4recUTckQHPo+VUNMYlSNeUhnlv/2TK7/qsfPMYTi0Xu/Fr+bnKn3QOPbgITS -cgHrplzueGhsVhhy+Cpn31FptA7txwcAWuWcZmT7ych0APt/PdkZ1CdeQ3gQop0p -BXaUlY7N4PacFyrC8Jha4p8THbbmfg6zTwaPggH8HonOIL5iA2yZz78uvZwqUd5i -QD0LMQZ3ZgNiqlwLxA8e6heSNA== -=V6He +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 +qoYDv3xF +=Wj3K -----END PGP MESSAGE----- From 596c6590e8d83a5e81503f991debd5c804600af8 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 12 Apr 2014 21:51:03 -0400 Subject: [PATCH 09/70] propellor spin --- privdata/diatom.kitenet.net.gpg | 182 ++++++++++++++++++-------------- 1 file changed, 105 insertions(+), 77 deletions(-) diff --git a/privdata/diatom.kitenet.net.gpg b/privdata/diatom.kitenet.net.gpg index b6508ba..34d986c 100644 --- a/privdata/diatom.kitenet.net.gpg +++ b/privdata/diatom.kitenet.net.gpg @@ -1,81 +1,109 @@ -----BEGIN PGP MESSAGE----- Version: GnuPG v1 -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 -qoYDv3xF -=Wj3K +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 +UUFGrYcSqu0P +=w6i8 -----END PGP MESSAGE----- From c7830f4e669735bf46945592b315e7e367129888 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 12 Apr 2014 22:36:36 -0400 Subject: [PATCH 10/70] propellor spin --- Propellor/Property/Cron.hs | 9 +- Propellor/Property/Obnam.hs | 77 ++++++++++++ config-joey.hs | 10 +- debian/changelog | 2 + privdata/diatom.kitenet.net.gpg | 211 ++++++++++++++++---------------- propellor.cabal | 1 + 6 files changed, 202 insertions(+), 108 deletions(-) create mode 100644 Propellor/Property/Obnam.hs diff --git a/Propellor/Property/Cron.hs b/Propellor/Property/Cron.hs index fa6019e..2fa9c87 100644 --- a/Propellor/Property/Cron.hs +++ b/Propellor/Property/Cron.hs @@ -4,13 +4,15 @@ import Propellor import qualified Propellor.Property.File as File import qualified Propellor.Property.Apt as Apt +import Data.Char + type CronTimes = String -- | Installs a cron job, run as a specificed user, in a particular --directory. Note that the Desc must be unique, as it is used for the --cron.d/ filename. job :: Desc -> CronTimes -> UserName -> FilePath -> String -> Property -job desc times user cddir command = ("/etc/cron.d/" ++ desc) `File.hasContent` +job desc times user cddir command = cronjobfile `File.hasContent` [ "# Generated by propellor" , "" , "SHELL=/bin/sh" @@ -20,6 +22,11 @@ job desc times user cddir command = ("/etc/cron.d/" ++ desc) `File.hasContent` ] `requires` Apt.serviceInstalledRunning "cron" `describe` ("cronned " ++ desc) + where + cronjobfile = "/etc/cron.d/" ++ map sanitize desc + sanitize c + | isAlphaNum c = c + | otherwise = '_' -- | Installs a cron job, and runs it niced and ioniced. niceJob :: Desc -> CronTimes -> UserName -> FilePath -> String -> Property diff --git a/Propellor/Property/Obnam.hs b/Propellor/Property/Obnam.hs new file mode 100644 index 0000000..ebdcb9d --- /dev/null +++ b/Propellor/Property/Obnam.hs @@ -0,0 +1,77 @@ +module Propellor.Property.Obnam where + +import Propellor +import qualified Propellor.Property.Apt as Apt +import qualified Propellor.Property.Cron as Cron +import Utility.SafeCommand + +installed :: Property +installed = Apt.installed ["obnam"] + +type ObnamParam = String + +-- | Installs a cron job that causes a given directory to be backed +-- up, by running obnam with some parameters. +-- +-- If the directory does not exist, or exists but is completely empty, +-- this Property will immediately restore it from an existing backup. +-- +-- So, this property can be used to deploy a directory of content +-- to a host, while also ensuring any changes made to it get backed up. +-- And since Obnam encrypts, just make this property depend on a gpg +-- key, and tell obnam to use the key, and your data will be backed +-- up securely. For example: +-- +-- > & Obnam.backup "/srv/git" "33 3 * * *" +-- > [ "--repository=2318@usw-s002.rsync.net:mygitrepos.obnam" +-- > , "--encrypt-with=1B169BE1" +-- > ] +-- > `requires` Gpg.keyImported "1B169BE1" "root" +-- > `requires` Ssh.keyImported SshRsa "root" +-- +-- How awesome is that? +backup :: FilePath -> Cron.CronTimes -> [ObnamParam] -> Property +backup dir crontimes params = cronjob `describe` desc + `requires` restored dir params + `requires` installed + where + desc = dir ++ " backed up by obnam" + cronjob = Cron.niceJob ("obnam_backup" ++ dir) crontimes "root" "/" $ + unwords $ + [ "obnam" + , "backup" + , shellEscape dir + ] ++ map shellEscape params + +-- | Restores a directory from an obnam backup. +-- +-- Only does anything if the directory does not exist, or exists, +-- but is completely empty. +-- +-- The restore is performed atomically; restoring to a temp directory +-- and then moving it to the directory. +restored :: FilePath -> [ObnamParam] -> Property +restored dir params = Property (dir ++ " restored by obnam") go + `requires` installed + where + go = ifM (liftIO needsRestore) + ( liftIO restore + , noChange + ) + + needsRestore = null <$> catchDefaultIO [] (dirContents dir) + + restore = withTmpDirIn (takeDirectory dir) "obnam-restore" $ \tmpdir -> do + ok <- boolSystem "obnam" $ + [ Param "restore" + , Param "--to" + , Param tmpdir + ] ++ map Param params + let restoreddir = tmpdir ++ "/" ++ dir + ifM (pure ok <&&> doesDirectoryExist restoreddir) + ( do + void $ tryIO $ removeDirectory dir + renameDirectory restoreddir dir + return MadeChange + , return FailedChange + ) diff --git a/config-joey.hs b/config-joey.hs index 7403f87..a983e87 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -18,6 +18,7 @@ import qualified Propellor.Property.OpenId as OpenId import qualified Propellor.Property.Docker as Docker import qualified Propellor.Property.Git as Git import qualified Propellor.Property.Gpg as Gpg +import qualified Propellor.Property.Obnam as Obnam import qualified Propellor.Property.SiteSpecific.GitHome as GitHome import qualified Propellor.Property.SiteSpecific.GitAnnexBuilder as GitAnnexBuilder import qualified Propellor.Property.SiteSpecific.JoeySites as JoeySites @@ -72,8 +73,13 @@ hosts = & Apt.buildDep ["git-annex"] `period` Daily & Git.daemonRunning "/srv/git" & File.ownerGroup "/srv/git" "joey" "joey" - & Gpg.keyImported "git.kitenet.net obnam backup key" "root" - & Ssh.keyImported SshRsa "root" + & Obnam.backup "/srv/git" "33 3 * * *" + [ "--repository=2318@usw-s002.rsync.net:git.kitenet.net" + , "--encrypt-with=1B169BE1" + ] + `requires` Gpg.keyImported "1B169BE1" "root" + `requires` Ssh.keyImported SshRsa "root" + -- git repos restore (how?) (also make backups!) -- family annex needs family members to have accounts, -- ssh host key etc.. finesse? diff --git a/debian/changelog b/debian/changelog index 29f1787..6593c95 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,8 @@ propellor (0.3.1) UNRELEASED; urgency=medium * Merge scheduler bug fix from git-annex. + * Support for provisioning hosts with ssh and gpg keys. + * Obnam support. -- Joey Hess Fri, 11 Apr 2014 15:00:11 -0400 diff --git a/privdata/diatom.kitenet.net.gpg b/privdata/diatom.kitenet.net.gpg index 34d986c..da97a08 100644 --- a/privdata/diatom.kitenet.net.gpg +++ b/privdata/diatom.kitenet.net.gpg @@ -1,109 +1,110 @@ -----BEGIN PGP MESSAGE----- Version: GnuPG v1 -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 -UUFGrYcSqu0P -=w6i8 +hQILA7ODiaEXBlRZAQ/4hK79L/K03NtaiKU3whmLdty0JG1zPvGgXLjuMQ2XxL+J +Pr98VUjwtYjKvRRc6XQaHNwPojbT8uy825wBL+0iBr7O2Uyog8c5vDPkC+ksVvJ2 +PJJBkwiXTVh6e7lbHENJUa8yf0z3UQlz++W8qQOMRreVEI6wSJOlxz70WarXgNOB +p+zD1bgr+8yaOMAjnDqkUPr5ItFXL5EUy5xL5Kud9A+ukYMYMtLJbHFIe6bMH1fH +GajRWbyisaVgT3Rqvejg96oUSV9J83Am4XHUq8gJwOJlULI9mx9CCwQLIjmGbcql +WVKWq+h/ERLOHaMhogMvNSXcdljRFpYRcN5Dll3hJt9DXGtHqfSpfb0ZhK5y/C3s +afS4pEdCzsghgG2ZEELeRUSsiKKxt9ws524OSOAF1OqGktSUOD1muwm+8whhjr/0 +kZIqlX/mesyAtxquBCHT5t0uMN00/ksC5nAZmi7YFibf/tCjQfE2BdtE5Y6AYrqT +8Rth5Y6kNwGzUYFqIvmScHrsxH6Tjc1n1nKEWeeWOM0Pooq45RlSXLnybReGDRAW +xINqKXEjKqzy4EXsHIBKv87DZJoE+hs3Jk100mtgRNVQYcdzXtiXeBe1EWob/fEz +UU2VxjwojPH9MakVPFmDjVw2t60Bhc246ovB8jSyKqLn8yPUnhYqjObEGCuie9Ls +AYiU8Tl9s7hIV7XpSl/jYLYNo99Zzw/jz8Q8eV3wzndy/9+FbOU4UOxDy+XpBldO +LZzdzUbjyBLqDMKoNuRjMzqq24vSizMGxYV8MImJ2H0+VEUx3g4wMRKUpH9D3kVE +wVfzztZ1bxkpjqQVfHxIJrKwgqHS7pPcgPDrNvhTJn2pM1VGzPjaZ+U/E7mKreFM +mWyjcq4jQhpek1hQ0lGzZEPJTJKOZng1IsxJRatdL3+oeqFQ0hIqm9WvbKChLlMN +N4n8QX1/9gx2lt27Bi+7bmIxn6cQN822xXFiUWlz53aJ1ahx+xG9Gr452nCFQlaG +90ci94nsqnn4cKMkEyMNuY33ae85+WYWIo15FbFPv2ReW9R+0g0SABJduNQzr5rA +88MZTsiAS6rE0sB7adZZ8U133Wdl/rlJ7sMpAWCGT/P3+BJlBHq0Z31DDaH5oTOs +uaLeri98dmkEuiQ4cBI6uvFVtR2KnzE80yrCuqyfsNay8UpYK5oJB7WWZ7u0EhhW +8WisATSNLVuwtBmN6Z8qpzmwthmAvCNfDLCOKeSA7tdOyetMtBQeOJ6o2o+KZbuv +1F8gMQJDub4tQcT2Hd6yglCTQUAoYdc3sa09XV23GYRiu4LfL9Z9gXMVCUA+XfsT +SdlBZ7c/dwp9zZzwEUw0tieUok9uq0POEvnb6MYms6aB+cUsZJiOj3NQ5O3D719B +9XKH82ZPTtruiGj/9pwoGa8HV04RoLg2pHxdsbeQ8nf8EYCDo8V5VzhBSFdJ/twy +ocy6G029Gcm2Suiw8iSrhw77SJEqfxV139TxC8k8BeQOJXqwh0hNasGcpSQDdRxR +r0kE0HQt/U9cdOBrAuC8JrSG9UlxCxGRpJXPYn2EeMTv8Ljb+DS/Ovvkjrh2wvVR +Uyv0i1gAOGS+DoYxYJgxuc49yQGSqfk0jM1LCVTxxPWcAb4ykrsxuLFqNsWgeSq/ +CkkniYCcb9oA5lsnGjW2JOokNOT7Tf1jb47Lrv3J0dtmScn16ACeXSScNndjY8Zf ++3OuMEazut+LAAogCpxQQqzDgBQ1xoUlsHyj5nwzOINbCE55dJ6oCy/a3bLpmuBC +/i4i5+AW5shfPAvHOcOa8Wac6YCkOiOEGfgYQp5iqneXod8WBNs5dxpkRAEw7iIQ +Y+0Rh+y/FiV7h6cQ74ZjZSyI4txqNCUs1GMb9XnPyuFrnUao4jkLhYnbfqXEp/IP +ggKSJAQyeqvipKDNOVt0CM+d0DLsyogp61zDnDBLtb/h4k+154FFkNBZfLQosNjq +evBF87HPBzAShTWlyGd3AtTZS5nQZsVBrq2wQF8X9oJfu9k80GrMo9wgWj4NE25c +BQv22NdmHKY+/KgzrnxcBlrRXAxbTdgKLG3khFJw3lIfdgrIYG9CQkg5A/JsXUa0 +R/LCMg8qq5u9PEWJrWhDQGF7T2wbzLoGiU7ujXe220gayn5a59kfbBQaUTt6c5i4 +t2u5oyroMJSZUsou7BubhLEaTaLj5QOlipw3Vb6xtTKdlb8KB9AudA28+jVS/HlN +2b/LnbgoJ9s6F8syyWjyTihpAMRypgyPf4QQuwjQ0FWLdsZiCCjFesNyY7Y0ishx +VnMjRpQrGBL93zdLUoFmDcXKYhmO6oUvh0nOUyhwDiZg34gJMQkRoVVl4ysSnDNh +CbeSDiRBb1ewoTdvwEleGoogYCbO3YoNFDZCUfeTymNxVUrJRQdZ3PL6KmGvFJAA +fm6+7YDOc1I0D+pa0OqVJnLRV+ib04KmjGGdSdWEtbPdOMolhQjKR2BCEePhcjdr +Tm/jrDrfum66qBbcAf+EysG+P8FjXd4sCoj2rtv39cNHmsjFpqNWqOEnrVPhJQlu +MDmikc3i+F61L4LtNN/TX/rbLmWAHEKI6f/2yAmhrq9fJNP2wGnmr8CbAlRAXrmZ +pcvFtxPaXQavn6pNjDFGP1qXSMYr28FV5munVszi+O5EJGo/ntRSKDuYW8UARYq4 +Gp+ez8ey9PREiLu9GAKGCGhWSqPcbGX8OhbTO/W9AYsIw4//Wj7lhEelowcwaIQG +iIGj+Rnni6XR6ixi/fItCoJJSN9O1ZIOBaCCKsEotQhnA8mtmMrjdSp+guxMg5d6 +bGlFXoU8A3/bQPvdGMo0HGeqRhMLIYbrvU4u3iEwyTYD4dtpS9t6/xq8mt6QDpJF +UKcNQlgLscVUBQw+Sni72hLADEbFa86QFg2X6lU+EfHLXcDjpsosj+4odicf8IoH +Y+twu7J4p4q2BGvUc2B2s4Q01sviqax99wauDC6x0p/8gRbrjTMVY4Se39xGWsvc +gYJYNMD4U0GWh4qw4I8W10HP1Vs2Qa0oV7WvWSq9OaAcJ1SRsjdKmRIEFa7m7JkS +C9mxsDkepiN/BIs22V4kiEDCA6J78e3R+It2x/UtvoqIxx3UxoQlQMo4KBcNZ/OI +wg00B7lCftuR9RajbpqpcZCx5p+NRY+N+LMcvOgOBHK3CzC1WN3E40xFL9yn+fKo +99MW3mB6wEsw1l5ph7iE+SEYeSxScVzCLEQaqNUK+U/+B1RBwQanKEy3zT3tG3Nw +mF5IYiKgvcWWd0ISjGVWD6bQc6yFUWqMjTi23ZaGFrHoAwqMUcZSCPdGzJ4QETJ4 +2yxG1pMtAxpBQm85hdWloDYA3kmL/StmJH928UlGNIxYhiyd9si5QbONjbRFelfO +hSiOh/bU8AjMxuC2Js+B/24XhsZ8StmsxihUajcgKrHLPtGuKyOX5qF+onIONSzG +Jhnhn1VS6WBW0HXXuiErt/GZD9LPPsDpMTB3PyGYvNZwmPKxXywRj8XISJNSn/6/ +4kzlPjLmI+i8z+7yflSWLVtw0APxHNn9QHP+Wp8vUYYMycTw+n23787gVI/zvB6L +zp019sRM0lDuPQ89Ai0vDOteouggYIxzjxflfrjIMePw5+ZJNLDjxdWnwmXvB8oC +BQND9ciYAFtXNnc+1rUEAskXaKAipTlvwEPg9ei5+U63biI15AETBVwDZthwUYvC +1QL1G6NcXdUgCHEev7vEPM35d63OhtbYGjAYinMH42Y88scHbCgIcgvYl9SydkOy +4X7tK7MFHJ22G6aV4XM+XPzoOLSqaB5Iz9PBSXjU5AC3wzFtAJzyGMGJROnIEpXG +nUjo39JRDeVXhHlZSKYda2cthHeyd/EoJjBjR0vJRluKn0gBNy3I3XzE2S1B00xm +XMMTBsoJwScqpGSr0TdAHUVa3If+5QdIs4okbtXPiT9N0F2Fe183enUQJnb2l6zT +bvGY2PGHFfRhebfygXaxNbeEz6DkHXGxIj07gJl6X5eDh0/clpzBLA91xRSWorf6 +/w52wWTUryG/sseFqHjuczVx9HMlqqs6ZBFXSG8p3pUzzyyaRT0T0HlUk8JBYHXv +cdsrBnzTqj7ZkFMJim3ZeZU1CJ6/A+AuU1Gdwuu1mLNpvT63+RpLj9mDDoHnsUIe +1JNijHwdYlF8vucmnT9N5KXc1t/ttxnlbJWbNVMDCaacREi3IGIdF/QVxdBf76iZ +ORvS40RITFLenZTjfWE4HlZQR36xHb0DdiFdeM+DuLBLEhHuCQCV/txMx3TAlVEp +Oep4mJvP0Vkq5ZVqZiQdEm/UO3vo7O+eEBFfupmb6AZwXYu/Sdf3SqOzIkbAkiek +d7jGvH0+TrTsstdqt2sH5IsnNkB+vLUxKiDjAlcute0JJK23utUu8fSUjZSMG15Q +480UFSL3HPzObC7Lcm4pRm7w/JYwhk4UfiZWAh/an24qOuvLNJVNptH/78QfGv2K +dsihyRv8PabwCikTMqiKzLPSa2ESPYLHX1oIXmF7mxp8fYrc6gUgq071ZOe9T0Dm ++hWhufsFApgfi5U4xmdTGwFFYfyqqhGFjYdTPXicQq94t134pGcJB1JXSNXOmDFO +hL3mokPqJF47FJoJLIcKl8oUxfD1gj8Nei42zjOXDS1aFb9Zc1GsRnwy+1g31tD3 +yEoj9Io7z5Pk4OWsc1DBgSFlKwITi3x6VUiZYnQ4AT1cb439dfVcNZCNuoXcuI2o +KZBw9UK04fIKMSR9vc7yEESwpZGwAwIN0wIrwqjMjk9IriPSZ6LhnlZaKz3Dz6lp +PuEMLklXxXA8Z8owmGrgNiCLNZoN7E6ODpSJMQAGn7nFwVHaZXOCj7QKfTiSHNqT +2P04q5TbvhyT7gDkXntvb4SWBIeoLPBJInMFiIUFqSx8pOeIVMCFoNI0tV+AoXoL +zRNav7i9ooSM1QBqPk1stlbxjFP6AkfSzOCJ3a+qaPkQIY33iOqJya81UOePZZQy +6EM449DmHbBdOaJXnNu90Za+jHmhemVIHgangrwb8mlLZeRGYS8rsL6OmjJaBvHT +2KY8SNnB+6UzPqfWytdGG8RT1xC68VXW3WVzfTQ9BFN2FFFTuCY+s8rDKj07Z5El +7wdBRiQQGgiVGtRolakuBGD+pFpwVYRbtAi9LmT+2zz4fPpkjeLtyfoac9L6OOiE +DlOENN8HpVb/DK+nzzDX9INIjJJXXodiEEUTHjm2SGVemQT2aByW+CCyp71Y/KcP +RKwmIRpw1r1RijuedGShaG8xdQksdBik5pTnYlet91iR766R/tB2vfEr8PUXCZ7/ +cR8Jg0Zv3YrUQ/NiYWywD+zZy50RpmTjVIIzgFCerva80jyn2kEsf/7FMQImpTWh +ZgDlGfbZmUVwyd8gHXMkuD09Itk/aonIlCyfiuMpTX72ptHvzceQ8DPeuz4oZb1i +FtckUpsDhAgn+yfQ20HOk9MdDy2SjeI4lNJxCl01o/x30vYmaETzBo03+WXTgl5D +0JG+52OQS/7q8PxBTul20WSGgTb0ZvreH2QLpxHRD/gpOvaYXXsPUhpp4tvIyEqS +7DLi0UR1VZd70/7zh8dOQlEfMWNKzrayUduw1hgAvGXWe5yrHgph40roORn4yvIA +bLOaIvAygkcVpTGkKst8K7nQ1yE21hogBWqtxe0SJHPKxJtrePLZYSDBu+DnJtPp +zbElXfV+Oyhr2ehLTD46B6iBm2ssFLFOt2ViNj9bT9X3YfFl8sV5U20jdPwR4kZ2 +V6V2cfQ8kxYqeLE/v/uRZ0wHegTLVJxbZ2bwvNegguHOu3phwnHS21nfC6UFD1wU +tMvVENzBGkGrsVEc+xCukB8gPI6O7PebNTcPY5SOHicgS2zx1HMWcTZh72wM5KCT +mXqMxr8wR/thg2870MhigaCm0AIjbJC5JbXxvhMSmqfdZSTeeCqzV/59mXACO8he +D1LLQ1J1ahpE5tf+6TCjqbsbMHqSduXk1G2hxIhx900h9SkeAJqjOqXZSwg8i/hj +Wwvs25yBve3tuGNkr6M5z6PoayYopiIo705B0y0AVhRJftSczUOERs603BJsVIwr +6FcdCh6WU/V+rkwCWk9gDGXEGUS61lDwNfJewF1mXRacuP76/X3zheg6fjJ2K6Mc +KsvNo+ap1DU4koB80INqkMC+FUKElRGqgdiJ1BsWfBW9U4gIiV4N6BWVZN/6fU2M +Qa39w8UEj1iZ05TDQ0JrzJEY/WVjUWqYh4MTa0SSYF4b18gNTKYw5pJ7Ff6z6jlT +tpNnzRf+kwfhT041zRDeuB3FdjKpIaIvakPxLEdvz4BVEM3Xbsi7c8G4/DndhC6f +3SSq0QC8T77kWDjw6m7/ZGYplAsrbtqFTd2MllkH1KRj8wfk57ZuDOUsV7ShplXI +RaATN0DicTbbsMWTHBw+/6Z3tc6PET4VFDHvBVWBSo+yEBzruhKnbhtxVJced44b +Hpht1opiAhikvkhUJJUYZQ9+QfRQwFsyR6XlW07xArCWkjg6PJlgcX39WTxbnAYR +grKgB87pp3qThnOd97cCgppj0ETJOCxEKnpSuT234IqlZcBhdhFMsB92xYMzY9Jq +wNf5JwKp1rm6k4cQldFDlQ58GzeUjQpa20625j4jIWIuZeZ5Nf6FECyBXi4cbEaA +/kCJ1kYezrPgaFt3p6JHzQ== +=5opC -----END PGP MESSAGE----- diff --git a/propellor.cabal b/propellor.cabal index b28a26d..cc616c1 100644 --- a/propellor.cabal +++ b/propellor.cabal @@ -78,6 +78,7 @@ Library Propellor.Property.Git Propellor.Property.Gpg Propellor.Property.Network + Propellor.Property.Obnam Propellor.Property.OpenId Propellor.Property.Reboot Propellor.Property.Scheduled From c97285a21ea0e392e8c63c1898ee2deeb34e99a0 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 02:28:40 -0400 Subject: [PATCH 11/70] propellor spin --- Propellor/Attr.hs | 17 ++++++++++ Propellor/Property/Obnam.hs | 37 ++++++++++++++++------ Propellor/Property/SiteSpecific/GitHome.hs | 6 ++-- Propellor/Property/Ssh.hs | 35 +++++++++++++++++--- Propellor/Property/User.hs | 8 ++--- Propellor/Types/Attr.hs | 5 ++- config-joey.hs | 11 ++++--- 7 files changed, 91 insertions(+), 28 deletions(-) diff --git a/Propellor/Attr.hs b/Propellor/Attr.hs index 4bc1c2c..67ea8b8 100644 --- a/Propellor/Attr.hs +++ b/Propellor/Attr.hs @@ -8,6 +8,7 @@ import Propellor.Types.Attr import "mtl" Control.Monad.Reader import qualified Data.Set as S import qualified Data.Map as M +import Control.Applicative pureAttrProperty :: Desc -> (Attr -> Attr) -> AttrProperty pureAttrProperty desc = AttrProperty $ Property ("has " ++ desc) @@ -31,6 +32,13 @@ cnameFor domain mkp = addCName :: HostName -> Attr -> Attr addCName domain d = d { _cnames = S.insert domain (_cnames d) } +sshPubKey :: String -> AttrProperty +sshPubKey k = pureAttrProperty ("ssh pubkey known") $ + \d -> d { _sshPubKey = Just k } + +getSshPubKey :: Propellor (Maybe String) +getSshPubKey = asks _sshPubKey + hostnameless :: Attr hostnameless = newAttr (error "hostname Attr not specified") @@ -45,3 +53,12 @@ hostMap l = M.fromList $ zip (map (_hostname . hostAttr) l) l findHost :: [Host] -> HostName -> Maybe Host findHost l hn = M.lookup hn (hostMap l) + +-- | Lifts an action into a different host. +-- +-- For example, `fromHost hosts "otherhost" getSshPubKey` +fromHost :: [Host] -> HostName -> Propellor a -> Propellor (Maybe a) +fromHost l hn getter = case findHost l hn of + Nothing -> return Nothing + Just h -> liftIO $ Just <$> + runReaderT (runWithAttr getter) (hostAttr h) diff --git a/Propellor/Property/Obnam.hs b/Propellor/Property/Obnam.hs index ebdcb9d..b7d3422 100644 --- a/Propellor/Property/Obnam.hs +++ b/Propellor/Property/Obnam.hs @@ -5,11 +5,21 @@ import qualified Propellor.Property.Apt as Apt import qualified Propellor.Property.Cron as Cron import Utility.SafeCommand +import Data.List + installed :: Property installed = Apt.installed ["obnam"] type ObnamParam = String +-- | An obnam repository can be used by multiple clients. Obnam uses +-- locking to allow only one client to write at a time. Since stale lock +-- files can prevent backups from happening, it's more robust, if you know +-- a repository has only one client, to force the lock before starting a +-- backup. Using OnlyClient allows propellor to do so when running obnam. +data NumClients = OnlyClient | MultipleClients + deriving (Eq) + -- | Installs a cron job that causes a given directory to be backed -- up, by running obnam with some parameters. -- @@ -23,25 +33,32 @@ type ObnamParam = String -- up securely. For example: -- -- > & Obnam.backup "/srv/git" "33 3 * * *" --- > [ "--repository=2318@usw-s002.rsync.net:mygitrepos.obnam" +-- > [ "--repository=sftp://2318@usw-s002.rsync.net/~/mygitrepos.obnam" -- > , "--encrypt-with=1B169BE1" --- > ] +-- > ] Obnam.OnlyClient -- > `requires` Gpg.keyImported "1B169BE1" "root" -- > `requires` Ssh.keyImported SshRsa "root" -- -- How awesome is that? -backup :: FilePath -> Cron.CronTimes -> [ObnamParam] -> Property -backup dir crontimes params = cronjob `describe` desc +backup :: FilePath -> Cron.CronTimes -> [ObnamParam] -> NumClients -> Property +backup dir crontimes params numclients = cronjob `describe` desc `requires` restored dir params - `requires` installed where desc = dir ++ " backed up by obnam" cronjob = Cron.niceJob ("obnam_backup" ++ dir) crontimes "root" "/" $ - unwords $ - [ "obnam" - , "backup" - , shellEscape dir - ] ++ map shellEscape params + intercalate ";" $ catMaybes + [ if numclients == OnlyClient + then Just $ unwords $ + [ "obnam" + , "force-lock" + ] ++ map shellEscape params + else Nothing + , Just $ unwords $ + [ "obnam" + , "backup" + , shellEscape dir + ] ++ map shellEscape params + ] -- | Restores a directory from an obnam backup. -- diff --git a/Propellor/Property/SiteSpecific/GitHome.hs b/Propellor/Property/SiteSpecific/GitHome.hs index 1ba56b9..ee46a9e 100644 --- a/Propellor/Property/SiteSpecific/GitHome.hs +++ b/Propellor/Property/SiteSpecific/GitHome.hs @@ -11,8 +11,7 @@ installedFor user = check (not <$> hasGitDir user) $ Property ("githome " ++ user) (go =<< liftIO (homedir user)) `requires` Apt.installed ["git"] where - go Nothing = noChange - go (Just home) = do + go home = do let tmpdir = home "githome" ensureProperty $ combineProperties "githome setup" [ userScriptProperty user ["git clone " ++ url ++ " " ++ tmpdir] @@ -32,5 +31,4 @@ url = "git://git.kitenet.net/joey/home" hasGitDir :: UserName -> IO Bool hasGitDir user = go =<< homedir user where - go Nothing = return False - go (Just home) = doesDirectoryExist (home ".git") + go home = doesDirectoryExist (home ".git") diff --git a/Propellor/Property/Ssh.hs b/Propellor/Property/Ssh.hs index 51649fd..009511d 100644 --- a/Propellor/Property/Ssh.hs +++ b/Propellor/Property/Ssh.hs @@ -5,7 +5,8 @@ module Propellor.Property.Ssh ( hasAuthorizedKeys, restartSshd, uniqueHostKeys, - keyImported + keyImported, + knownHost, ) where import Propellor @@ -39,12 +40,20 @@ permitRootLogin = setSshdConfig "PermitRootLogin" passwordAuthentication :: Bool -> Property passwordAuthentication = setSshdConfig "PasswordAuthentication" +dotDir :: UserName -> IO FilePath +dotDir user = do + h <- homedir user + return $ h ".ssh" + +dotFile :: FilePath -> UserName -> IO FilePath +dotFile f user = do + d <- dotDir user + return $ d f + hasAuthorizedKeys :: UserName -> IO Bool -hasAuthorizedKeys = go <=< homedir +hasAuthorizedKeys = go <=< dotFile "authorized_keys" where - go Nothing = return False - go (Just home) = not . null <$> catchDefaultIO "" - (readFile $ home ".ssh" "authorized_keys") + go f = not . null <$> catchDefaultIO "" (readFile f) restartSshd :: Property restartSshd = cmdProperty "service" ["ssh", "restart"] @@ -87,3 +96,19 @@ keyImported keytype user = propertyList desc SshRsa -> "rsa" SshDsa -> "dsa" ++ ext + +-- | Puts some host's ssh public key into the known_hosts file for a user. +knownHost :: [Host] -> HostName -> UserName -> Property +knownHost hosts hn user = Property desc $ + go =<< fromHost hosts hn getSshPubKey + where + desc = user ++ " knows ssh key for " ++ hn + go (Just (Just k)) = do + f <- liftIO $ dotFile "known_hosts" user + ensureProperty $ propertyList desc + [ File.dirExists (takeDirectory f) + , f `File.containsLine` (hn ++ " " ++ k) + ] + go _ = do + warningMessage $ "no configred sshPubKey for " ++ hn + return FailedChange diff --git a/Propellor/Property/User.hs b/Propellor/Property/User.hs index 9d94883..8e7afd8 100644 --- a/Propellor/Property/User.hs +++ b/Propellor/Property/User.hs @@ -7,7 +7,7 @@ import Propellor data Eep = YesReallyDeleteHome accountFor :: UserName -> Property -accountFor user = check (isNothing <$> homedir user) $ cmdProperty "adduser" +accountFor user = check (isNothing <$> catchMaybeIO (homedir user)) $ cmdProperty "adduser" [ "--disabled-password" , "--gecos", "" , user @@ -16,7 +16,7 @@ accountFor user = check (isNothing <$> homedir user) $ cmdProperty "adduser" -- | Removes user home directory!! Use with caution. nuked :: UserName -> Eep -> Property -nuked user _ = check (isJust <$> homedir user) $ cmdProperty "userdel" +nuked user _ = check (isJust <$> catchMaybeIO (homedir user)) $ cmdProperty "userdel" [ "-r" , user ] @@ -57,5 +57,5 @@ getPasswordStatus user = parse . words <$> readProcess "passwd" ["-S", user] isLockedPassword :: UserName -> IO Bool isLockedPassword user = (== LockedPassword) <$> getPasswordStatus user -homedir :: UserName -> IO (Maybe FilePath) -homedir user = catchMaybeIO $ homeDirectory <$> getUserEntryForName user +homedir :: UserName -> IO FilePath +homedir user = homeDirectory <$> getUserEntryForName user diff --git a/Propellor/Types/Attr.hs b/Propellor/Types/Attr.hs index c253e32..cdbe9ca 100644 --- a/Propellor/Types/Attr.hs +++ b/Propellor/Types/Attr.hs @@ -6,6 +6,7 @@ import qualified Data.Set as S data Attr = Attr { _hostname :: HostName , _cnames :: S.Set Domain + , _sshPubKey :: Maybe String , _dockerImage :: Maybe String , _dockerRunParams :: [HostName -> String] @@ -15,6 +16,7 @@ instance Eq Attr where x == y = and [ _hostname x == _hostname y , _cnames x == _cnames y + , _sshPubKey x == _sshPubKey y , _dockerImage x == _dockerImage y , let simpl v = map (\a -> a "") (_dockerRunParams v) @@ -25,12 +27,13 @@ instance Show Attr where show a = unlines [ "hostname " ++ _hostname a , "cnames " ++ show (_cnames a) + , "sshPubKey " ++ show (_sshPubKey a) , "docker image " ++ show (_dockerImage a) , "docker run params " ++ show (map (\mk -> mk "") (_dockerRunParams a)) ] newAttr :: HostName -> Attr -newAttr hn = Attr hn S.empty Nothing [] +newAttr hn = Attr hn S.empty Nothing Nothing [] type HostName = String type Domain = String diff --git a/config-joey.hs b/config-joey.hs index a983e87..e66df10 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -74,13 +74,12 @@ hosts = & Git.daemonRunning "/srv/git" & File.ownerGroup "/srv/git" "joey" "joey" & Obnam.backup "/srv/git" "33 3 * * *" - [ "--repository=2318@usw-s002.rsync.net:git.kitenet.net" + [ "--repository=sftp://2318@usw-s002.rsync.net/~/git.kitenet.net.obnam" , "--encrypt-with=1B169BE1" - ] + ] Obnam.OnlyClient `requires` Gpg.keyImported "1B169BE1" "root" `requires` Ssh.keyImported SshRsa "root" - - -- git repos restore (how?) (also make backups!) + `requires` Ssh.knownHost hosts "usw-s002.rsync.net" "root" -- family annex needs family members to have accounts, -- ssh host key etc.. finesse? -- (also should upgrade git-annex-shell for it..) @@ -89,6 +88,10 @@ hosts = -- gitweb -- downloads.kitenet.net setup (including ssh key to turtle) + -- I don't run this system, but tell propellor its public key. + , host "usw-s002.rsync.net" + & sshPubKey "ssh-dss AAAAB3NzaC1kc3MAAAEBAI6ZsoW8a+Zl6NqUf9a4xXSMcV1akJHDEKKBzlI2YZo9gb9YoCf5p9oby8THUSgfh4kse7LJeY7Nb64NR6Y/X7I2/QzbE1HGGl5mMwB6LeUcJ74T3TQAlNEZkGt/MOIVLolJHk049hC09zLpkUDtX8K0t1yaCirC9SxDGLTCLEhvU9+vVdVrdQlKZ9wpLUNbdAzvbra+O/IVvExxDZ9WCHrnfNA8ddVZIGEWMqsoNgiuCxiXpi8qL+noghsSQNFTXwo7W2Vp9zj1JkCt3GtSz5IzEpARQaXEAWNEM0n1nJ686YUOhou64iRM8bPC1lp3QXvvZNgj3m+QHhIempx+de8AAAAVAKB5vUDaZOg14gRn7Bp81ja/ik+RAAABACPH/bPbW912x1NxNiikzGR6clLh+bLpIp8Qie3J7DwOr8oC1QOKjNDK+UgQ7mDQEgr4nGjNKSvpDi4c1QCw4sbLqQgx1y2VhT0SmUPHf5NQFldRQyR/jcevSSwOBxszz3aq9AwHiv9OWaO3XY18suXPouiuPTpIcZwc2BLDNHFnDURQeGEtmgqj6gZLIkTY0iw7q9Tj5FOyl4AkvEJC5B4CSzaWgey93Wqn1Imt7KI8+H9lApMKziVL1q+K7xAuNkGmx5YOSNlE6rKAPtsIPHZGxR7dch0GURv2jhh0NQYvBRn3ukCjuIO5gx56HLgilq59/o50zZ4NcT7iASF76TcAAAEAC6YxX7rrs8pp13W4YGiJHwFvIO1yXLGOdqu66JM0plO4J1ItV1AQcazOXLiliny3p2/W+wXZZKd5HIRt52YafCA8YNyMk/sF7JcTR4d4z9CfKaAxh0UpzKiAk+0j/Wu3iPoTOsyt7N0j1+dIyrFodY2sKKuBMT4TQ0yqQpbC+IDQv2i1IlZAPneYGfd5MIGygs2QMfaMQ1jWAKJvEO0vstZ7GB6nDAcg4in3ZiBHtomx3PL5w+zg48S4Ed69BiFXLZ1f6MnjpUOP75pD4MP6toS0rgK9b93xCrEQLgm4oD/7TCHHBo2xR7wwcsN2OddtwWsEM2QgOkt/jdCAoVCqwQ==" + --' __|II| ,. ---- __|II|II|__ ( \_,/\ ------'\o/-'-.-'-.-'-.- __|II|II|II|II|___/ __/ -'-.-'-.-'-.-'-.-'- From 00993a11fdfa06726a2e1711004a750bbd362227 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 03:09:00 -0400 Subject: [PATCH 12/70] propellor spin --- Propellor/Property/Ssh.hs | 54 +++++++++++++++++++++++++++++---------- Propellor/Types.hs | 1 + config-joey.hs | 20 +++++++++------ 3 files changed, 53 insertions(+), 22 deletions(-) diff --git a/Propellor/Property/Ssh.hs b/Propellor/Property/Ssh.hs index 009511d..51bb7c1 100644 --- a/Propellor/Property/Ssh.hs +++ b/Propellor/Property/Ssh.hs @@ -4,9 +4,11 @@ module Propellor.Property.Ssh ( passwordAuthentication, hasAuthorizedKeys, restartSshd, - uniqueHostKeys, + randomHostKeys, + hostKey, keyImported, knownHost, + authorizedKeys ) where import Propellor @@ -61,11 +63,11 @@ restartSshd = cmdProperty "service" ["ssh", "restart"] -- | Blows away existing host keys and make new ones. -- Useful for systems installed from an image that might reuse host keys. -- A flag file is used to only ever do this once. -uniqueHostKeys :: Property -uniqueHostKeys = flagFile prop "/etc/ssh/.unique_host_keys" +randomHostKeys :: Property +randomHostKeys = flagFile prop "/etc/ssh/.unique_host_keys" `onChange` restartSshd where - prop = Property "ssh unique host keys" $ do + prop = Property "ssh random host keys" $ do void $ liftIO $ boolSystem "sh" [ Param "-c" , Param "rm -f /etc/ssh/ssh_host_*" @@ -74,28 +76,44 @@ uniqueHostKeys = flagFile prop "/etc/ssh/.unique_host_keys" cmdProperty "/var/lib/dpkg/info/openssh-server.postinst" ["configure"] --- | Sets up a user with a ssh private key from the site's privdata. +-- | Sets ssh host keys from the site's PrivData. +-- +-- (Uses a null username for host keys.) +hostKey :: SshKeyType -> Property +hostKey keytype = propertyList desc + [ Property desc (install writeFile (SshPubKey keytype "") ".pub") + , Property desc (install writeFileProtected (SshPrivKey keytype "") "") + ] + where + desc = "known ssh host key" + install writer p ext = withPrivData p $ \key -> do + let f = "/etc/ssh/ssh_host_" ++ fromKeyType keytype ++ "key" ++ ext + void $ liftIO $ writer f key + noChange + +-- | Sets up a user with a ssh private key and public key pair +-- from the site's PrivData. keyImported :: SshKeyType -> UserName -> Property keyImported keytype user = propertyList desc - [ Property desc (install (SshPubKey keytype user) ".pub") - , Property desc (install (SshPrivKey keytype user) "") + [ Property desc (install writeFile (SshPubKey keytype user) ".pub") + , Property desc (install writeFileProtected (SshPrivKey keytype user) "") ] where desc = user ++ " has ssh key" - install p ext = do + install writer p ext = do f <- liftIO $ keyfile ext ifM (liftIO $ doesFileExist f) ( noChange , withPrivData p $ \key -> makeChange $ - writeFileProtected f key + writer f key ) keyfile ext = do home <- homeDirectory <$> getUserEntryForName user - return $ home ".ssh" "id_" - ++ case keytype of - SshRsa -> "rsa" - SshDsa -> "dsa" - ++ ext + return $ home ".ssh" "id_" ++ fromKeyType keytype ++ ext + +fromKeyType :: SshKeyType -> String +fromKeyType SshRsa = "rsa" +fromKeyType SshDsa = "dsa" -- | Puts some host's ssh public key into the known_hosts file for a user. knownHost :: [Host] -> HostName -> UserName -> Property @@ -112,3 +130,11 @@ knownHost hosts hn user = Property desc $ go _ = do warningMessage $ "no configred sshPubKey for " ++ hn return FailedChange + +-- | Makes a user have authorized_keys from the PrivData +authorizedKeys :: UserName -> Property +authorizedKeys user = Property (user ++ " has authorized_keys") $ + withPrivData (SshAuthorizedKeys user) $ \v -> liftIO $ do + f <- liftIO $ dotFile "authorized_keys" user + writeFileProtected f v + return NoChange diff --git a/Propellor/Types.hs b/Propellor/Types.hs index 86c56a2..dd66eb0 100644 --- a/Propellor/Types.hs +++ b/Propellor/Types.hs @@ -166,6 +166,7 @@ data PrivDataField = DockerAuthentication | SshPubKey SshKeyType UserName | SshPrivKey SshKeyType UserName + | SshAuthorizedKeys UserName | Password UserName | PrivFile FilePath | GpgKey GpgKeyId diff --git a/config-joey.hs b/config-joey.hs index e66df10..ff8c133 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -69,10 +69,10 @@ hosts = & Apt.serviceInstalledRunning "ntp" & Dns.zones myDnsSecondary & Apt.serviceInstalledRunning "apache2" - & Apt.installed ["git", "git-annex", "rsync"] - & Apt.buildDep ["git-annex"] `period` Daily - & Git.daemonRunning "/srv/git" - & File.ownerGroup "/srv/git" "joey" "joey" + + & cname "git.kitenet.net" + & Ssh.hostKey SshDsa + & Ssh.hostKey SshRsa & Obnam.backup "/srv/git" "33 3 * * *" [ "--repository=sftp://2318@usw-s002.rsync.net/~/git.kitenet.net.obnam" , "--encrypt-with=1B169BE1" @@ -80,13 +80,17 @@ hosts = `requires` Gpg.keyImported "1B169BE1" "root" `requires` Ssh.keyImported SshRsa "root" `requires` Ssh.knownHost hosts "usw-s002.rsync.net" "root" - -- family annex needs family members to have accounts, - -- ssh host key etc.. finesse? - -- (also should upgrade git-annex-shell for it..) + `requires` Ssh.authorizedKeys "family" + `requires` User.accountFor "family" + & Apt.installed ["git", "git-annex", "rsync"] + & 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 -- gitweb -- downloads.kitenet.net setup (including ssh key to turtle) + & Apt.buildDep ["git-annex"] `period` Daily -- I don't run this system, but tell propellor its public key. , host "usw-s002.rsync.net" @@ -184,7 +188,7 @@ image _ = "debian-stable-official" -- does not currently exist! cleanCloudAtCost :: Property cleanCloudAtCost = propertyList "cloudatcost cleanup" [ Hostname.sane - , Ssh.uniqueHostKeys + , Ssh.randomHostKeys , "worked around grub/lvm boot bug #743126" ==> "/etc/default/grub" `File.containsLine` "GRUB_DISABLE_LINUX_UUID=true" `onChange` cmdProperty "update-grub" [] From 90a6a6cb5800bc41395bff09fc7090eba41c3b14 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 03:17:31 -0400 Subject: [PATCH 13/70] propellor spin --- privdata/diatom.kitenet.net.gpg | 271 +++++++++++++++++++------------- 1 file changed, 165 insertions(+), 106 deletions(-) diff --git a/privdata/diatom.kitenet.net.gpg b/privdata/diatom.kitenet.net.gpg index da97a08..cf3c471 100644 --- a/privdata/diatom.kitenet.net.gpg +++ b/privdata/diatom.kitenet.net.gpg @@ -1,110 +1,169 @@ -----BEGIN PGP MESSAGE----- Version: GnuPG v1 -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 -/kCJ1kYezrPgaFt3p6JHzQ== -=5opC +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 +INladqAQRg== +=U5Y6 -----END PGP MESSAGE----- From 427246db6a6dc1d626297cf0af6f372a3c75486f Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 03:21:02 -0400 Subject: [PATCH 14/70] propellor spin --- Propellor/Property/Ssh.hs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Propellor/Property/Ssh.hs b/Propellor/Property/Ssh.hs index 51bb7c1..426e286 100644 --- a/Propellor/Property/Ssh.hs +++ b/Propellor/Property/Ssh.hs @@ -85,7 +85,7 @@ hostKey keytype = propertyList desc , Property desc (install writeFileProtected (SshPrivKey keytype "") "") ] where - desc = "known ssh host key" + desc = "known ssh host key (" ++ fromKeyType keytype ++ ")" install writer p ext = withPrivData p $ \key -> do let f = "/etc/ssh/ssh_host_" ++ fromKeyType keytype ++ "key" ++ ext void $ liftIO $ writer f key @@ -99,7 +99,7 @@ keyImported keytype user = propertyList desc , Property desc (install writeFileProtected (SshPrivKey keytype user) "") ] where - desc = user ++ " has ssh key" + desc = user ++ " has ssh key (" ++ fromKeyType keytype ++ ")" install writer p ext = do f <- liftIO $ keyfile ext ifM (liftIO $ doesFileExist f) @@ -136,5 +136,6 @@ authorizedKeys :: UserName -> Property authorizedKeys user = Property (user ++ " has authorized_keys") $ withPrivData (SshAuthorizedKeys user) $ \v -> liftIO $ do f <- liftIO $ dotFile "authorized_keys" user + createDirectoryIfMissing True (takeDirectory f) writeFileProtected f v return NoChange From 756d5754a9dd3d9e90bdbf03916820bd26f61db7 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 03:28:53 -0400 Subject: [PATCH 15/70] propellor spin --- Propellor/Property/Ssh.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Propellor/Property/Ssh.hs b/Propellor/Property/Ssh.hs index 426e286..ba23253 100644 --- a/Propellor/Property/Ssh.hs +++ b/Propellor/Property/Ssh.hs @@ -87,7 +87,7 @@ hostKey keytype = propertyList desc where desc = "known ssh host key (" ++ fromKeyType keytype ++ ")" install writer p ext = withPrivData p $ \key -> do - let f = "/etc/ssh/ssh_host_" ++ fromKeyType keytype ++ "key" ++ ext + let f = "/etc/ssh/ssh_host_" ++ fromKeyType keytype ++ "_key" ++ ext void $ liftIO $ writer f key noChange @@ -123,7 +123,7 @@ knownHost hosts hn user = Property desc $ desc = user ++ " knows ssh key for " ++ hn go (Just (Just k)) = do f <- liftIO $ dotFile "known_hosts" user - ensureProperty $ propertyList desc + ensureProperty $ combineProperties desc [ File.dirExists (takeDirectory f) , f `File.containsLine` (hn ++ " " ++ k) ] From fe939677adf9fa7bd8311fa437c757d91b3abae6 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 03:36:53 -0400 Subject: [PATCH 16/70] propellor spin --- config-joey.hs | 1 + 1 file changed, 1 insertion(+) diff --git a/config-joey.hs b/config-joey.hs index ff8c133..dd45404 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -76,6 +76,7 @@ hosts = & Obnam.backup "/srv/git" "33 3 * * *" [ "--repository=sftp://2318@usw-s002.rsync.net/~/git.kitenet.net.obnam" , "--encrypt-with=1B169BE1" + , "--client-name=wren" ] Obnam.OnlyClient `requires` Gpg.keyImported "1B169BE1" "root" `requires` Ssh.keyImported SshRsa "root" From 622a3d8a931979deec838f06f7fb0311adf40df6 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 03:49:24 -0400 Subject: [PATCH 17/70] propellor spin --- Propellor/Property/Ssh.hs | 7 +++++-- config-joey.hs | 5 +++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Propellor/Property/Ssh.hs b/Propellor/Property/Ssh.hs index ba23253..2fc3c56 100644 --- a/Propellor/Property/Ssh.hs +++ b/Propellor/Property/Ssh.hs @@ -84,12 +84,15 @@ hostKey keytype = propertyList desc [ Property desc (install writeFile (SshPubKey keytype "") ".pub") , Property desc (install writeFileProtected (SshPrivKey keytype "") "") ] + `onChange` restartSshd where desc = "known ssh host key (" ++ fromKeyType keytype ++ ")" install writer p ext = withPrivData p $ \key -> do let f = "/etc/ssh/ssh_host_" ++ fromKeyType keytype ++ "_key" ++ ext - void $ liftIO $ writer f key - noChange + s <- liftIO $ readFileStrict f + if s == key + then noChange + else makeChange $ writer f key -- | Sets up a user with a ssh private key and public key pair -- from the site's PrivData. diff --git a/config-joey.hs b/config-joey.hs index dd45404..394881b 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -74,7 +74,7 @@ hosts = & Ssh.hostKey SshDsa & Ssh.hostKey SshRsa & Obnam.backup "/srv/git" "33 3 * * *" - [ "--repository=sftp://2318@usw-s002.rsync.net/~/git.kitenet.net.obnam" + [ "--repository=sftp://2318@usw-s002.rsync.net/~/git.kitenet.net" , "--encrypt-with=1B169BE1" , "--client-name=wren" ] Obnam.OnlyClient @@ -93,7 +93,8 @@ hosts = -- downloads.kitenet.net setup (including ssh key to turtle) & Apt.buildDep ["git-annex"] `period` Daily - -- I don't run this system, but tell propellor its public key. + -- I don't run this system, so only relevant property is its + -- public key. , host "usw-s002.rsync.net" & sshPubKey "ssh-dss AAAAB3NzaC1kc3MAAAEBAI6ZsoW8a+Zl6NqUf9a4xXSMcV1akJHDEKKBzlI2YZo9gb9YoCf5p9oby8THUSgfh4kse7LJeY7Nb64NR6Y/X7I2/QzbE1HGGl5mMwB6LeUcJ74T3TQAlNEZkGt/MOIVLolJHk049hC09zLpkUDtX8K0t1yaCirC9SxDGLTCLEhvU9+vVdVrdQlKZ9wpLUNbdAzvbra+O/IVvExxDZ9WCHrnfNA8ddVZIGEWMqsoNgiuCxiXpi8qL+noghsSQNFTXwo7W2Vp9zj1JkCt3GtSz5IzEpARQaXEAWNEM0n1nJ686YUOhou64iRM8bPC1lp3QXvvZNgj3m+QHhIempx+de8AAAAVAKB5vUDaZOg14gRn7Bp81ja/ik+RAAABACPH/bPbW912x1NxNiikzGR6clLh+bLpIp8Qie3J7DwOr8oC1QOKjNDK+UgQ7mDQEgr4nGjNKSvpDi4c1QCw4sbLqQgx1y2VhT0SmUPHf5NQFldRQyR/jcevSSwOBxszz3aq9AwHiv9OWaO3XY18suXPouiuPTpIcZwc2BLDNHFnDURQeGEtmgqj6gZLIkTY0iw7q9Tj5FOyl4AkvEJC5B4CSzaWgey93Wqn1Imt7KI8+H9lApMKziVL1q+K7xAuNkGmx5YOSNlE6rKAPtsIPHZGxR7dch0GURv2jhh0NQYvBRn3ukCjuIO5gx56HLgilq59/o50zZ4NcT7iASF76TcAAAEAC6YxX7rrs8pp13W4YGiJHwFvIO1yXLGOdqu66JM0plO4J1ItV1AQcazOXLiliny3p2/W+wXZZKd5HIRt52YafCA8YNyMk/sF7JcTR4d4z9CfKaAxh0UpzKiAk+0j/Wu3iPoTOsyt7N0j1+dIyrFodY2sKKuBMT4TQ0yqQpbC+IDQv2i1IlZAPneYGfd5MIGygs2QMfaMQ1jWAKJvEO0vstZ7GB6nDAcg4in3ZiBHtomx3PL5w+zg48S4Ed69BiFXLZ1f6MnjpUOP75pD4MP6toS0rgK9b93xCrEQLgm4oD/7TCHHBo2xR7wwcsN2OddtwWsEM2QgOkt/jdCAoVCqwQ==" From 6d1263043112d0c70ae8d76fcbc998e6d853fafa Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 11:14:43 -0400 Subject: [PATCH 18/70] propellor spin --- Propellor/Property/Obnam.hs | 4 +++- Propellor/Property/Ssh.hs | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Propellor/Property/Obnam.hs b/Propellor/Property/Obnam.hs index b7d3422..00e0bbe 100644 --- a/Propellor/Property/Obnam.hs +++ b/Propellor/Property/Obnam.hs @@ -72,7 +72,9 @@ restored dir params = Property (dir ++ " restored by obnam") go `requires` installed where go = ifM (liftIO needsRestore) - ( liftIO restore + ( do + warningMessage $ dir ++ " is empty/missing; restoring from backup ..." + liftIO restore , noChange ) diff --git a/Propellor/Property/Ssh.hs b/Propellor/Property/Ssh.hs index 2fc3c56..cb3b923 100644 --- a/Propellor/Property/Ssh.hs +++ b/Propellor/Property/Ssh.hs @@ -80,7 +80,7 @@ randomHostKeys = flagFile prop "/etc/ssh/.unique_host_keys" -- -- (Uses a null username for host keys.) hostKey :: SshKeyType -> Property -hostKey keytype = propertyList desc +hostKey keytype = combineProperties desc [ Property desc (install writeFile (SshPubKey keytype "") ".pub") , Property desc (install writeFileProtected (SshPrivKey keytype "") "") ] @@ -97,7 +97,7 @@ hostKey keytype = propertyList desc -- | Sets up a user with a ssh private key and public key pair -- from the site's PrivData. keyImported :: SshKeyType -> UserName -> Property -keyImported keytype user = propertyList desc +keyImported keytype user = combineProperties desc [ Property desc (install writeFile (SshPubKey keytype user) ".pub") , Property desc (install writeFileProtected (SshPrivKey keytype user) "") ] From 456dd534ce2984535a9fc36bad2aff9e6ee2863a Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 11:58:22 -0400 Subject: [PATCH 19/70] propellor spin --- Propellor/Property/File.hs | 34 +++- Propellor/Property/OpenId.hs | 13 +- Propellor/Property/Ssh.hs | 1 + Propellor/Types.hs | 2 +- config-joey.hs | 16 +- privdata/diatom.kitenet.net.gpg | 335 ++++++++++++++++---------------- 6 files changed, 219 insertions(+), 182 deletions(-) diff --git a/Propellor/Property/File.hs b/Propellor/Property/File.hs index 10dee75..d8caf36 100644 --- a/Propellor/Property/File.hs +++ b/Propellor/Property/File.hs @@ -1,8 +1,10 @@ module Propellor.Property.File where import Propellor +import Utility.FileMode import System.Posix.Files +import System.PosixCompat.Types type Line = String @@ -12,11 +14,15 @@ f `hasContent` newcontent = fileProperty ("replace " ++ f) (\_oldcontent -> newcontent) f -- | 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 f = Property ("privcontent " ++ f) $ - withPrivData (PrivFile f) (\v -> ensureProperty $ f `hasContent` lines v) +hasPrivContent f = Property desc $ withPrivData (PrivFile f) $ \privcontent -> + 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. containsLine :: FilePath -> Line -> Property @@ -38,7 +44,9 @@ notPresent f = check (doesFileExist f) $ Property (f ++ " not present") $ makeChange $ nukeFile f 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 go True = do ls <- liftIO $ lines <$> readFile f @@ -46,13 +54,15 @@ fileProperty desc a f = Property desc $ go =<< liftIO (doesFileExist f) if ls' == ls then noChange 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. - -- Replicate the original file mode before moving it into place. + -- Replicate the original file's owner and mode. updatefile f' content = do - writeFile f' content - getFileStatus f >>= setFileMode f' . fileMode + writer f' content + s <- getFileStatus f + setFileMode f' (fileMode s) + setOwnerAndGroup f' (fileOwner s) (fileGroup s) -- | Ensures a directory exists. dirExists :: FilePath -> Property @@ -68,3 +78,9 @@ ownerGroup f owner group = Property (f ++ " owner " ++ og) $ do else noChange where 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 diff --git a/Propellor/Property/OpenId.hs b/Propellor/Property/OpenId.hs index c397bdb..b896180 100644 --- a/Propellor/Property/OpenId.hs +++ b/Propellor/Property/OpenId.hs @@ -4,8 +4,10 @@ import Propellor import qualified Propellor.Property.File as File import qualified Propellor.Property.Apt as Apt import qualified Propellor.Property.Service as Service +import Utility.FileMode import Data.List +import System.Posix.Files providerFor :: [UserName] -> String -> Property providerFor users baseurl = propertyList desc $ @@ -16,11 +18,18 @@ providerFor users baseurl = propertyList desc $ (map setbaseurl) "/etc/simpleid/config.inc" ] ++ map identfile users where - identfile u = File.hasPrivContent $ concat - [ "/var/lib/simpleid/identities/", u, ".identity" ] url = "http://"++baseurl++"/simpleid" desc = "openid provider " ++ url setbaseurl l | "SIMPLEID_BASE_URL" `isInfixOf` l = "define('SIMPLEID_BASE_URL', '"++url++"');" | 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" ] diff --git a/Propellor/Property/Ssh.hs b/Propellor/Property/Ssh.hs index cb3b923..6bfe126 100644 --- a/Propellor/Property/Ssh.hs +++ b/Propellor/Property/Ssh.hs @@ -117,6 +117,7 @@ keyImported keytype user = combineProperties desc fromKeyType :: SshKeyType -> String fromKeyType SshRsa = "rsa" fromKeyType SshDsa = "dsa" +fromKeyType SshEcdsa = "ecdsa" -- | Puts some host's ssh public key into the known_hosts file for a user. knownHost :: [Host] -> HostName -> UserName -> Property diff --git a/Propellor/Types.hs b/Propellor/Types.hs index dd66eb0..b8f8f16 100644 --- a/Propellor/Types.hs +++ b/Propellor/Types.hs @@ -174,5 +174,5 @@ data PrivDataField type GpgKeyId = String -data SshKeyType = SshRsa | SshDsa +data SshKeyType = SshRsa | SshDsa | SshEcdsa deriving (Read, Show, Ord, Eq) diff --git a/config-joey.hs b/config-joey.hs index 394881b..71048cf 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -73,6 +73,7 @@ hosts = & cname "git.kitenet.net" & Ssh.hostKey SshDsa & Ssh.hostKey SshRsa + & Ssh.hostKey SshEcdsa & Obnam.backup "/srv/git" "33 3 * * *" [ "--repository=sftp://2318@usw-s002.rsync.net/~/git.kitenet.net" , "--encrypt-with=1B169BE1" @@ -83,15 +84,20 @@ hosts = `requires` Ssh.knownHost hosts "usw-s002.rsync.net" "root" `requires` Ssh.authorizedKeys "family" `requires` User.accountFor "family" - & Apt.installed ["git", "git-annex", "rsync"] + & Apt.installed ["git", "git-annex", "rsync", "kgb-client"] & 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 + -- TODO: upgrade to newer git-annex-shell for notification -- 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 + -- downloads.kitenet.net setup (including ssh key to turtle) -- I don't run this system, so only relevant property is its -- public key. diff --git a/privdata/diatom.kitenet.net.gpg b/privdata/diatom.kitenet.net.gpg index cf3c471..d5c1c56 100644 --- a/privdata/diatom.kitenet.net.gpg +++ b/privdata/diatom.kitenet.net.gpg @@ -1,169 +1,174 @@ -----BEGIN PGP MESSAGE----- Version: GnuPG v1 -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 -INladqAQRg== -=U5Y6 +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 +=ncya -----END PGP MESSAGE----- From 52a6909b9337a9714ff815f4706b511c165e7380 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 12:07:38 -0400 Subject: [PATCH 20/70] propellor spin --- config-joey.hs | 2 +- privdata/diatom.kitenet.net.gpg | 351 ++++++++++++++++---------------- 2 files changed, 182 insertions(+), 171 deletions(-) diff --git a/config-joey.hs b/config-joey.hs index 71048cf..0371ce7 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -91,7 +91,7 @@ hosts = -- gitweb & cname "kgb.kitenet.net" - & Apt.serviceInstalledRunning "kbg-bot" + & Apt.serviceInstalledRunning "kgb-bot" & File.hasPrivContent "/etc/kgb-bot/kgb.conf" & File.hasPrivContent "/etc/kgb-bot/kgb-client.conf" diff --git a/privdata/diatom.kitenet.net.gpg b/privdata/diatom.kitenet.net.gpg index d5c1c56..e52b874 100644 --- a/privdata/diatom.kitenet.net.gpg +++ b/privdata/diatom.kitenet.net.gpg @@ -1,174 +1,185 @@ -----BEGIN PGP MESSAGE----- Version: GnuPG v1 -hQIMA7ODiaEXBlRZARAAs9po6rZcmQLqpt/2ZCpOSuJTNAQ00/Vq+UqI/AXxI2rX -/xg16LkLmGmMjFi9uTbHK/qQBwF6crgcHXelzs1DEdU7Dp0He5ekMW0+Xdx0N11w -RnxlwP2r7VYEKQciQ6M2OnkCP4gwJU/KjzkVtSjsRoOpx69bvL77xeFFPLuFkB+0 -m/gyJ68LYE4EbSxk6j6JiFuPkldmfoApr7K89Ox0+7ZWsSvG8dokyif+ljqkd1NA -Bt/a8t1xhRpzWh6jam1X9W2gWLP4t1DSNfnc+NoCdNaHv/HLqlRd6xm5uI0OdXU2 -gJ0zjTyJ71K5fbFQxWyyJSN3UN9OuNtGOyXaWlv/QkFpDo46HgMByHbV1ywSs/GQ -E2eQ9yiKCmmf/TPTfWzuEKDV0zmp+/sxi8InQOeH4WdeInmmlunfVzIPsqAkgmJB -BOyQmJhC5bi2VAZci+/myF8YsNqGpaCb6EuV4473FNVDXSXXugpIsn2adf4ckITV -bbgwzsK9SldbVtkifPkIn6VSSE4ylGJY5Al6fmn/DiofhJbt9ydFb1bKKwX2t6ZM -tPJbv8vW16wFmf4biVGh4OKCcBN+wM8b6GgFEtgJk4wjXHVSE6ftnRH/LU64aoVq -QnIh/RdkR9xIIAkPx/cldlK/sNbFTAZdpqfuHuFJW+EGhtMSAFeceZaPDCiG6HTS -7AEOhvh+39c5W6A8HPl3kp+NgiqVmT+HfH7/9VECDM+XHYwh3bsJZ9zYu1R9Ou9b -1IAZFIispPTdUZmcYrMd1G3fn07EeIHlCmvfyUqoAt/QVWrWlwLnywiervKembFx -ubBo8wF9lhRicPzufDeo1zTpBhvONz/4wzR+QC/pa536tdE7ekHI95joe76pPdoF -yYKOMKAfDqDNqHFuvllfc+sB9K9+78cx6L3Lh3e74qNp63gIwFUbtDRID+rAo6fh -7LNCAvOqZqE+d35s4//nAe+g7Xbf1UCfLzogO9vib3Mu0raovQXhYH1MVTIW8OYh -LNx7ffnURoFr3KVwblw/V5n3gl25vw6l8QaLTU3ad7Cp1XO+5kbqe15q1uVydz3L -r3i0gVEchG9sr0Aup1iGqK5sik3hh9kIkO1Vugst73M/wJOsmpHCJVil2F4fEMDc -FIK7C+TzhCXGw7+7ec2chBke9gilMPqSYkS6I71s0zc8MVO5sMYIiaKe98vJvWl/ -Y8oEjoW1dwQNzXuqffm444BU5fGDg3Qs4zVeaozNmwRz9YGP+7pgKetabZ8HZBPl -L2VxBqq/X/zaMBkQJvTsHvAGkCueM25r9s60kmd4MNWRYKJTKIPBNaV9lShEbdzY -OaAop5ttZlo2sq8EbOLTAHnLv/+dqxSzlRnG8zaLcTInyDDEhgeNeADocH19TfJR -b2kuQRZRlodLyBh56oOeGfVvsDjeqA2ziovYMa4DEcfF2hX8C3yNb4rp/DIUlGSQ -QjVTYK3NmsU3XAYFgx7PX8WcsBRfgEQKhG7EPiisxVjP+2qjfuSrXgD9lKa18Y+2 -VU+6KJL4Dy++ccveSj8e0c4A/HUQZFIFeXeqt0U+4IzAKzFsgh0IYuNlz3NBXRe+ -7h/kpr/WouY63xNudI3mSF3i6ETn4gFZCTwB1BvQyOxbo9KPtLbTFwnOBgf9tzEI -tUvIz5STFOVzb3BCVQr7n8FT+B9qcD9FvlOJkdn5GBzlOpaNWPON6/f7w88Xozht -IEnWIx8o2yn5O3En9ckKpSyiwgnJvd/HgE8beMEVvFkUDSyDuiWc5k8NMaj7XGfy -TByBL8fXJ2lTG2uoE9Z7VKD6VsJLPITwwPqQFzAnAiWnRDIrVVkzivd26s1q7VNT -ddyNK7CdVzIFl/FCjitd10kz3Gx/RbfSASD1+447JNn0OUSPMatQqtg+q9c4WEW5 -3hc6nkxQc/g9znl61ewDCHbW/QZQf6bXlpKKyabRmJYzAQrtXuHif1iyiHXRRF6L -VkjrQwN+mDI+c1tk0Je3wf3Rk4yuEjBNPifbAdpktnhMLjwBgWPoBWCnojNAwmEs -P0rWp8M5+kgLlXy3P1HcQ76ime7GuJjJxTt56EK7ojaWTtWU3N17RBoAPDuAjwP0 -TysflXzyEELNuprLiZqmZCij2d/XAf6vQNf7nT3dgQfrWghxuJjfs5mYi99w312U -sG9mwmqS4QsP7keTgZz11XUaTuOZoZsY4DP83rvwnP3FHJM4DMJcGccrTIGM418d -wRk+NhS1y07WoGsKr++E1yDTp5ALgETg6dQg1ZWTZSJ3NwEkAc6EyLqacz9+upzr -NhZKk28LIIe4f7jXD+OfjuZ7tITig5yu9+HnbilrQvKJ9ZxL7OTGb3SH1NLbdU5I -d31ydnB+jRDW0c3XFexsTXa/2njRPVnLrcf5f728BLwsGc4EbLegZw00O1YyUEkR -VvDlAtIOah7fejoCTn9TiiVAnpKW6uj3Pmv7DVC0eMkzdsswCdzZ66QHNaMm52XW -LqP+dxEvkJH9JTp/KRx78fnQPV6LuzlrFv9x7nNmA82dvNwbrwyWIE2y9tqj2cpC -TWNER3AgnDLI5rbZ3WyoC+KIPCQJJR8T2BeF3kCz4SlErCUVpnyiDeOySJiSAb6N -PLbe02Q9c5uc8x3xNUOXdlWWnnNUYrW3fb6UkBU3mQSMa2c9AuxeFB0aI3uVLf+V -ubPzyfTS6GRzviqHMdAo+FlrvOXyrAu9tn6IRpPckNXu09586vmTK84gXVD81eQ9 -NOrjCVGsrVmSsKrwX4DKntZgFWLoBvWJPTEh90lkR+kXKr9YgaHAz4ywheU3aIDE -V+KcXyAOLeZsHsdqp9IsVX7uuakQVa0SqehsvLBcNs9j69PHj9yiBoOjrqcRnQVL -Wdg80604cuSDUvKBhP9XgcRHKmTXBTakqFNKwuQuKIrCRa+ePQKdXh4uEggdNZio -niyZ4YySBlcj+5M0CUwTDTNaJRM6TGTlQCGuzMhld2th6jSvYUuk6RuV8K5TM0jR -SrR8KnipGh3aCQ7fU0KRy2j2p2SNOggWbHNl1bWOLhMfk8+9jiZBcFtt67PmhjPN -UzdO1eV9ltKz3okohgC7u0KBoovtS8Vuk2k3sca6oR0jvyoZ2jCXZfMnLyL1C1fU -xroZO7IiZ9c/TSt8u+4B0Kht3/7NfpXApIP7y4Lt6Z7yLb8WXxWHhyFgQ2+uGK4a -ut+t9vOHMXY4sQ+WUUck/pWAGCITf5Qzeai8yyZLYdPDM/UqBwo2z3ux66DL4Apj -0/9p8V0OBbm9IX46Vq+sHN6/zkzYRglxJLygSwePdemW54FBY3/wGl94fH0zkvxi -adoWJan9V7BkolC0HNMPnHpXxfWruTNVrzTzoxRoz/Y/maDWkt28m0Q6CYmV3Ebt -ZOl3Qf1vJoja04e+2GQdzxJ+1kUjAz1IjUaVP3+tY0BBpxU6asJdntW0MVCbWdKG -2cDir4SRte2fRihh4HdYMUjW2thQPz561O1n00dmjFe1DK6RGEz3Hy2fgvRQhT79 -d9+Hfj3ihLAGO6B6lVLSyZt8MhaHF3AMReEqpo25bHy4HarXsf63G5EdIvwm7IwE -UqOI1WKjFOPmR0WDvZ+ahjYQh8QbhlxGdQJBgdZaXxPTyR5pVVxWTXgLXmqvBTqo -4zNRcYYRBQ7fh94S/of7OThkPsJ2qZoL+UZAGrZirt7BDwDngFr44ikgNBkF+8/Q -FK3XhD3TQWouDB3B/9Z5b3LtITuhYhF8v7sDAYUisijcqjXKkExhipp9WHz6POyi -t3CdI6LGkf/GrHpZDFdUich46zpc7TXk+jVzA+yw5zFZ1TTA6+6Ww8DG+ztChiMy -PdnRlUpq9RdCylI6fQXL1Ew/uxlvEYVKvHw0uoj5uOxhu+dM7criGLT+KinfJC2i -zuHG5iwmvUvdEKXN9s59vKmRmRHDBrs2rk3maQOoMYhEyXEuiQwJaVpPR3LLZ3Hh -rSKyocD3vURejCaRUi+3fz0Ns23tE2pvqE2GHCPHw8wzLOpkSspKFpuQ/dosRUJA -D/P56aG5Tw4gl6FWul64ty3wmNLszkUrmUMdmO2xveF+cexBCGirzmYcErwDW9w2 -DDkO2HA1Gz1+y2PTdkegBigMnrMLYjWmxSUJU29pQJclxGrcWrjG0CDIVhGqgSJf -4kPMWosCw+ARfZBlSbjPC38klm/Zml/VSPHx+ZRe5CnQeVM74CStDvOjM5Y5VX7V -N76J6fJ09m+8uoa4dpE2+UsQCbiKiMd3RIA6EkP3OrErQL5iYIA6SJPUUvpkUSmE -qGUrw8iaxB4w6SGWx6vzjuqlF4yImouJrbzyN97Jb6OstMQzxmF6Ys2B67XT/5I+ -w0lRKeZiHT7PTMsfdMoApKoIdoFJULnltfLJ+5P22gkYQ8INfoN2qEMecyge74p/ -VbFhSoGkI5gTUFH0FlUW+cUlwcEX621iZ4rLupDh3pW5Yy4jsb9B/A5IfWAm9s2u -N2eCyRdCkPNmCeMuc1AR1vJHmDflnoURZumYLNPapAQCoT7EuVBLOz5q0Cd1/h// -YLbe12ZiSbuNh8l7J3MH/YwyS0ULwmhTC1wLE+a6arpu/ErylVL7uWBmr3dzW4os -hs2HEVnUlOwI3xlRwizSe7n8EcBdRT/lxPE50BKWN9Z91mk6ICocxHKBraHjpFcy -NGNtVlUekqy7u6KnQVSvLdSG7kopNpJQfmM7bYc0s9uCTVR/9alYMI4VWZiXfbQq -B7frc/O95IUk3zyQG+paGjSZBNRyBPVBXIIKEXoUgEQcy2yWawt5+spCA4BzyFpH -LJ9esLgZA4/ihmbc9CQGQ5tjow9/gnd4kvb20OyE2SanjlqMEqyctrBY7FojxUlp -c8KY49CRsnbvwH6k/u7JXkQP0Ai1U8/9vKnBY5LunWlkLKR7bWpldGUWVrQePxfa -mR7Ed2tFWXRl+pNUQyvmazm+3gew2azmMeZXItNQ08ZN5kY8fqqwxNVs7I8uePLY -F7WhbO+zquNa5Z/7B7f1Iy2UdAyoL6yRE3ln4VS/twfEK2l4uDwpt/ft38Y0Vo6y -QKPyBvbpU1ULHJ6XmXFGASAQEBMg4UDwBOMWu4dQnzH9d2VHr4g8G/lOiTNi/TxH -QcQZiTGGEDCwSjNonOYYTx72pW+uFUb0irUisxQMyIpqHzSZg5FX39e07L3OpceU -ei0s2TMsUG7HLbi8p0kdQwHYeyrOvOd4CVhomjImyyC7D1DWXVfbkdJJ3yNAXfn8 -llDzdqg+LutH76aQVIdCTTaIw8O7JGaJBm/DEMyIV3Ex8RcpRGtNkg284DN+0dhJ -7ge5mCH0wchy1hZ/Eadt+pBgnR88fmRW0LkTyJvd/lBM1IQNVSnv0jMFiIxLT2Sp -MbqEbA1WPeE3mErL7sGKuSNhqaFujXxxBZCoIFoHTdSUBD9CVW9BKaGBgngInnSP -VXQPGhIllNOSHgWpomuPMqMA/vWPBr4T/wLkSVnslqbegfaLYP28SYeadZka/DQL -a592khT8eDu8F37N4kQOe6mkSJeAuOdTymRZTLpRzn5hk+SesmDGnTXLaJ+5RA9h -eaFsPEPPPWV8EJPnAvVniiLRR82xdvf0uGYm1PFtW9TyuyalmgvWwQhlvNIppjkP -ylEWYp8IJUQuOka3D1QdyYqz23RoXOxHm7BFjEtqO/8QnwnY86eVf4l+WBLPgYou -auo6yrlxV9FxXgFhScjffXN++YNDUyCYCIffVasLlZOdXhTgQq6JaNscJ4fHnXHb -raIGSesaIPxcMQ4tWUjm4bylFOcbahASuKDc2qdsBjiqa/K2DumCpgFafheVJvDc -nNBuybDAfPI2b76IqGcEHjhGKslCXEuXK0IEmkNMN7jVqJfTu52GHfd8x61B5gO0 -gWxvZDkNceor/wuY7s3R20iQ7P7LhHCvVR5ErHbesBl9ikz8HfBa7IBYcbthVevM -Wpt95Zcg914I38ZtD+FdE7vSsjbQrlqoD5Z2Ftoz0n9i10qCrgpvO8TH9cPjBYDG -E6tyQiFwLDlvTmIwH99TMCdjYP50BJLrVXXwCHlQkorOq/MvtU0HXnCKnuWgNCPP -PKkFrUSEsaginpsmrGHr7pBRyUa57xtzb5CkyDVqW12NG64pMZPHHKD2vdLMbIuC -lJpUYSDFU23R+HoilRXd+IPrnk+wOe+N+73RCdA8+qjYsqkSCk1p9fWGer9OhDJt -f8Izuhu2HtqMgULxlrLFPSfD5av6JW/pE+De2LPkfje4f5Re90Fw2KCvTTbiZXGs -C4xyiOBCt0kg3GPBSo4XW06xHgOG+WurgU9RZCYMzMg0NHjy6ENrLnNSn2RqMz+4 -BvYPnKP2UuMCFUbIRAP7CQrV+K7f/nJ5LA/KGMfo8l6JHBOog+JhYDBQbKAMav9+ -2SYMpAqBHhfPZzh0CgVcNhvgMvpB+tuElSwJyG9V8RC2XMU3dZ/rglPkg75TP8Xk -MEI3N7z8NcmKKQRbL0qULWhvSjhkU6+/lwiH+ykYWHil8/oy6YnwbYp/uE3XZvGj -zwbQK+lq6gHqDnTaJ0JIYTEVnXn3gIUGLvmXTtFRzepTkDLdUfKrGiDJwlseNMX5 -iEJt7jAUWI5hhXOeuQApH8g7w8gGWN25Tr26nRCOwxXctFMbk3Lah240S00sJzfU -PITZdUcRJf4sDu7e13YMGgyWX4VrltEAgLKiVC2jVmcoXamSY51EOsAQXVkhDbtH -4Dgz2YGSmrIhfEKt47nwhqvaxJSB349YlYwkJKjxPlzPovypg14yENgemkuF21pf -w6StU5qe04CdWVl+2SXhCykM7CNeSl7qjpvCnbJmuk9q98TFVb55Oe9K9t24A/Nk -yIAYBYFN+Xkdfubw7v1M6ZPuNUXI2W8vwNMg2BxiATn2RgqvEIOKnuNgUol4WC2a -k8b4M7mWBVrDGuLLxlN23n/2YK2xZTHmlFy9ZuY7GQdGhHGJK1ST1piST0o44EpC -FDT5r/UQWByJMpBoEaRXXV2JEJUUcZ0DUWtM9C/dREVIX0vaPt/IZMcSrXIRvLLe -HOo9yIKrY6cZUNFE+zafVlFBG4gwWaszlKuegSWs3iThQuizDOXOBnKDywV4sCtp -ui8zmQOc4thLUSKy0ceZv+NbqrfwEZC6ZWkbHStzzTEPp3hRRzB4JGsOmv2FT751 -bEn3Z4Atbmh140IMnGdOWOV2HFmWZ8JktBccgOUb2kMVnbiDtxWgpaFlNKCXZycC -YwBgBg2s08j/znu0Oary6RgYPeFygUquMgTGbPUJ3Q5W+hsRqaRHFx3pj5+UG13j -Rswjg4B/Xqn4QTdT++Rf02KRdkOwNLmPrhBLiDe671tT9U/gxl6YOGrialg8A+8U -LCTQxmRiiH0XXJcKqnUo7JLbDw38pK/AyDV4bbSbT9p6Dnv8d3A5kqAF7eM1K9Kz -QbhvM63Etl2y5aaRwmDemC7nUrfUzNW4ow1ugTAr3F0oZQByuDVKRS4OzWpysgGo -tkCgrzO9uxHlRw4Kis/6vrDOMhZJwLnibnrZeIjKSXAQZfeY/m/bJaWIsqK9od3g -pMpCeyF5KC/5uNivkaTEIF7iU/P5hSypbG4Ne62KUI5qT6u4wRWHkdiTVNBWty/Z -ke43ISTVTwi6VGpen32SyuE2YvjKd5DYdpZq/H4vEieuDSnGT05WzqszFCae0Ry5 -1b/RPKRiI/rcH2u1Qe+0jNzG1xV7/Y3ODN+JoCXitnFMSGPwacZLg8oGqgKaPYkG -iUJHhhBPjxiqO2wTXJUHjIBZCCUhW57h5tBNDP1jsopg+grwbT2CKzvQtuo/p3X8 -1g8TzuA44Ro/5YxN5Z4wuMBGV1kstj9x5OxU/iZEqUwGqJq5JK/QpFshyhwfDGCd -FMunk5k61HMReODyc3r0A1gj4UCeaSpaNneEDFjxuat8/Fy84ziaoOFrIVUHushF -92lRo50Wl22xYWXWZ1t8P6tjIPt+mSispsnVWR9JgYpKsufR5nGejaa85kc5jXvh -Atekk7PPWO96Qz9cI6sRrtoMriUTqtuwOx/TtF6gMbIhptwY317+0LmK5Px9IBU2 -bieznA2g7JOhQ7woaOA0hzIZhc6GYgLocPBtPcA0RRkG5sSDyUTxGMlqY3RymdWi -BpVABvhtqqTzBFTTyyoheUAXRcgdorLaQf+tvcI0Z/3wilXQsnAyU1cYD5wuNlHY -GBVpV5WmID6b2jmw/Ar1iHpk/Jc/0TdFb6CL2np2Qr1fuf73X816JA/3aiQF2bz/ -NOWeI7jlXpPyBSt0cB9hi836fEbTNG5S5PyAOS5oAIPgTgLfAQaosIw28q6EESnc -2OuMjwxE49jLtDW6Ed7Dy4PTBMCHRmlBekB5yoxfxIoF3K7Djqp5sDSRNG1bVpTQ -xN8fuRkcqwcq8vuAWkmFH91d6I24WSjznU7J4kY7OKm5AJ+AuGDTY00LxeRCrHFj -Yl9kBclIcRFztUFB1D1euPFIXhYAztOBpOlujyCmZiedk9jVVqV6tkKK8ZFa8M9/ -jDAfiXcXnYYvGzmLseG85U6xa3JGTryo34E/X5gt8N+dEGv2VvFzW1jLanRH+m5i -Bycht5w5B7iHqLrfmgpJBKYgMkptSt2uuIxKJULaCck8YP40SQjquJNgYLElwY4u -LOC6ACUYlP713jt7Vh8d+Wc82m0xDbqhQaP9ELHpAANSBlmcLvS/hxrq/+8NkbCQ -9M6is6h/AzoWBVryfATz6cr3YPwr/XPGnwAy9/9NkOl2hX94EsxRGSiOWqcZv7xK -Z/SL67HezCx295a9GwuO6TogGkjm+wJ6ecOFxIG2Fng5fMA6bjtzNxAAHmKwSwVJ -yUNam2cn33melgcP4LoYSQqYupY9Y310zuN5/k2sTC8kp2KKQ+/h54qk92QHbWnE -nT/qCYrbUTQ44RAXF8CQF983hPzur2YtOOISMuiY+SxQxFwk7+5eibw2jk2/I7VS -pcNwO7kS5KUbU886eFIaWquV/or33j56JmHMX9EuzNMvFjZwK6GcKdGS+5lo+B8P -w8UWg0s5dTvf5vPECaKgvaiN26YVV38h7ghOvdhvVHbR8cqabHoqV1derVi3996Z -KwBBlZDdPHfdh8N/LED97QHmaDfWxj/ud2FfkkWL5/iWSZXim+pbUXFgEtIoJ8n+ -mki4tizQ7IQSuM7XZHgWunoPi7VVvcqyGW3i0O+ZBoJZcGuB5KF1KaBNt1SDwjZe -0hA321cXjneNGuA6meJXfWVRcJ1S73cywZ5WfTret2Cna+mkq6R/H4x/Z/itLu1p -rH/4jH2oRzWuMZR8xeOO0lM8v2vQkvs+XmueLXo7kXGQF0zkWi8KN6kvGthZ6HDP -VVgOBWMU70PaEe8w37Y1g+XiDbM5i+qVXR96SYiY6kJhpbTwTFi8WNPH64VduIjf -8po1gbCFRewV1/RMLPqAGmJMsbDkmhXJPwao6yrDeLRMkWwcdJ6rBprkNSrXcSsk -OxW0B9ty+uzkV9A9yBYRoB+Wbvnd7x8J00YtX4otgh8h9DsuuDy/iXB7IG85B4gE -wGeH1KJx1oi4+v/Ddie+c3o9tqzufcEY86StpPC6rsoIr8KafyLz21kntgDXMBzC -yCnr3qJXn6os8OnVaW3RFN18tEJM/qXcni0saNU4IfWTpqaNYYAm0bdTA+jkXs+O -q63GPKvNrLiTedkuK4VhyvNX+XZ75JncIT5n2fj/wN0CiPb2khNzHbP65MEufCbX -QNOdx4vv5MtXcCBe6fFTcv8wa2XXkmUjlYFugWpWReX1QaGf5v6omucHhP5JJAKD -xmvoWJYBRejy2vo2X8xsHshe017V78cpUqQnLK5w/7BRqv2GfP32DT+LjknL5kH4 -vK08gWtGa0Rh/VDm7hhzm+Rpxsq69jELZBRx6LQXW0tmb99AH931nbaXiurLp7xx -II6P0LeOp6/FfgamQbbbb5D1LL5G9WMkzoRXOKQlMBksjvqtkunk2WpjMdbbfZrd -7Q40SjquXFStuyl5IxXCcYV2EOKpCfvez0iCNROfNlW/ZmFASqLHfHwr8TKtY46t -N9u4TWG7jbwBdPlLTveYtlKt8lLyWIyA1saJ3nvxw010Pxh60YKZ0MpqknjbjJYH -JMbRar3+vwhavRK+btLCXf3doZL8CMayZKNqOcSp+YpvpxxvIW3+eL0LeB66kPi0 -we0BoG2X7WkiwNV3e6nEBcbx3oCH4Iv3QvkQ0ABB5UvFLIZ77jYF5yYr/kOPHI91 -6XZ8TUhqa0zdRdxKRPW2lI4vrMDXcGat0+qpf916GCv1U06l6vU/YC8rXgwfMMzm -S1AxDDwefvsJtgZ6T1NP8hATXZ03SQWg9pjxv9UU4U0ZUDQ1DaStp+nM3mWQN/fR -G6Mn9ABVlwBvQ6bc6OKpsBkqT6eJzpeztjxcTQ85H94ZgaNDIQVLtanJdwYEtBUS -RU20bbk3yctGMRu6bxz8KfPJtoeqy58eqDvszhY57OCJAPUXsVtQZSj8G2h2m0cw -aj5h2EKzZGF1OShmHGRi1lUFo7H8nQGBDbOTAPmBTB1uPswVxIhvtqf4r0EOrmWV -n6P84tbq5i2g7SAqhNxu6NeKmzgzk0l5WW8YnqFYcPCdaIUvqc3E3GtSkWbMSL5T -HamDx1tLtaWAZv7eNhd8H0wjQUSBtcy3mlkiKWam5wSo9hlv3+HRtkLkMrRjeb+2 -4h0SSZpwi7uGmMF2QLcmo2w2UcZmYEpfpXuzJPDGMIVqGqtrOzJbsNytauyam138 -MFwaR1v3TnVe9JvktHf5qH6ZSotwmHh5qQcTEbY1u3jzMhoizSiS5wOjGc4= -=ncya +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 +=y7k+ -----END PGP MESSAGE----- From ebfba3828cadb0c53712410e0935dba4a58c1f6b Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 12:10:43 -0400 Subject: [PATCH 21/70] propellor spin --- config-joey.hs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config-joey.hs b/config-joey.hs index 0371ce7..7537b10 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -5,6 +5,7 @@ import Propellor.CmdLine import Propellor.Property.Scheduled import qualified Propellor.Property.File as File import qualified Propellor.Property.Apt as Apt +import qualified Propellor.Property.Service as Service import qualified Propellor.Property.Network as Network import qualified Propellor.Property.Ssh as Ssh import qualified Propellor.Property.Cron as Cron @@ -94,6 +95,8 @@ hosts = & Apt.serviceInstalledRunning "kgb-bot" & File.hasPrivContent "/etc/kgb-bot/kgb.conf" & File.hasPrivContent "/etc/kgb-bot/kgb-client.conf" + & "/etc/default/kgb-bot" `File.containsLine` "BOT_ENABLED=1" + `onChange` Service.running "kgb-bot" & cname "downloads.kitenet.net" & Apt.buildDep ["git-annex"] `period` Daily From 479045277b29919797cee341b11d30bbd15ab3d7 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 12:21:43 -0400 Subject: [PATCH 22/70] propellor spin --- Propellor/Property/File.hs | 5 +++++ Propellor/Property/OpenId.hs | 13 ++++--------- config-joey.hs | 20 ++++++++++++++------ 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/Propellor/Property/File.hs b/Propellor/Property/File.hs index d8caf36..bd33c9b 100644 --- a/Propellor/Property/File.hs +++ b/Propellor/Property/File.hs @@ -24,6 +24,11 @@ hasPrivContent f = Property desc $ withPrivData (PrivFile f) $ \privcontent -> where desc = "privcontent " ++ f +-- | Leaves the file world-readable. +hasPrivContentExposed :: FilePath -> Property +hasPrivContentExposed f = hasPrivContent f `onChange` + mode f (combineModes (ownerWriteMode:readModes)) + -- | 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) go f diff --git a/Propellor/Property/OpenId.hs b/Propellor/Property/OpenId.hs index b896180..d06bf88 100644 --- a/Propellor/Property/OpenId.hs +++ b/Propellor/Property/OpenId.hs @@ -4,7 +4,6 @@ import Propellor import qualified Propellor.Property.File as File import qualified Propellor.Property.Apt as Apt import qualified Propellor.Property.Service as Service -import Utility.FileMode import Data.List import System.Posix.Files @@ -25,11 +24,7 @@ providerFor users baseurl = propertyList desc $ "define('SIMPLEID_BASE_URL', '"++url++"');" | 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" ] + -- the identitites directory controls access, so open up + -- file mode + identfile u = File.hasPrivContentExposed $ + concat $ [ "/var/lib/simpleid/identities/", u, ".identity" ] diff --git a/config-joey.hs b/config-joey.hs index 7537b10..2245f8d 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -85,18 +85,15 @@ hosts = `requires` Ssh.knownHost hosts "usw-s002.rsync.net" "root" `requires` Ssh.authorizedKeys "family" `requires` User.accountFor "family" - & Apt.installed ["git", "git-annex", "rsync", "kgb-client"] + & Apt.installed ["git", "git-annex", "rsync", "kgb-client-git"] & Git.daemonRunning "/srv/git" -- ssh keys for branchable and github repo hooks -- TODO: upgrade to newer git-annex-shell for notification -- gitweb & cname "kgb.kitenet.net" - & Apt.serviceInstalledRunning "kgb-bot" - & File.hasPrivContent "/etc/kgb-bot/kgb.conf" - & File.hasPrivContent "/etc/kgb-bot/kgb-client.conf" - & "/etc/default/kgb-bot" `File.containsLine` "BOT_ENABLED=1" - `onChange` Service.running "kgb-bot" + & Docker.docked hosts "kgb-server" + & File.hasPrivContentExposed "/etc/kgb-bot/kgb-client.conf" & cname "downloads.kitenet.net" & Apt.buildDep ["git-annex"] `period` Daily @@ -127,7 +124,18 @@ hosts = & Docker.publish "8081:80" & OpenId.providerFor ["joey", "liw"] "openid.kitenet.net:8081" + + -- The kgb irc bot, in a container for security and because I need + -- features not in the stable version. + , standardContainer "kgb-server" Unstable "amd64" + & Docker.publish "9999:9999" + & Apt.serviceInstalledRunning "kgb-bot" + & File.hasPrivContent "/etc/kgb-bot/kgb.conf" + & "/etc/default/kgb-bot" `File.containsLine` "BOT_ENABLED=1" + `describe` "kgb bot enabled" + `onChange` Service.running "kgb-bot" + -- Exhibit: kite's 90's website. , standardContainer "ancient-kitenet" Stable "amd64" & Docker.publish "1994:80" & Apt.serviceInstalledRunning "apache2" From 4bcd5816d156400282e160c1ae4d5ea4b2f78bed Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 12:24:14 -0400 Subject: [PATCH 23/70] propellor spin --- Propellor/Property/OpenId.hs | 1 - config-joey.hs | 10 ++++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Propellor/Property/OpenId.hs b/Propellor/Property/OpenId.hs index d06bf88..4c56217 100644 --- a/Propellor/Property/OpenId.hs +++ b/Propellor/Property/OpenId.hs @@ -6,7 +6,6 @@ import qualified Propellor.Property.Apt as Apt import qualified Propellor.Property.Service as Service import Data.List -import System.Posix.Files providerFor :: [UserName] -> String -> Property providerFor users baseurl = propertyList desc $ diff --git a/config-joey.hs b/config-joey.hs index 2245f8d..ca7a021 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -48,6 +48,11 @@ hosts = & cname "ancient.kitenet.net" & Docker.docked hosts "ancient-kitenet" + -- I'd rather this container were on diatom, but + -- docker.io is not available in stable. + & cname "kgb.kitenet.net" + & Docker.docked hosts "kgb-server" + & Docker.garbageCollected `period` Daily & Apt.installed ["git-annex", "mtr", "screen"] @@ -86,14 +91,11 @@ hosts = `requires` Ssh.authorizedKeys "family" `requires` User.accountFor "family" & Apt.installed ["git", "git-annex", "rsync", "kgb-client-git"] + & File.hasPrivContentExposed "/etc/kgb-bot/kgb-client.conf" & Git.daemonRunning "/srv/git" -- ssh keys for branchable and github repo hooks -- TODO: upgrade to newer git-annex-shell for notification -- gitweb - - & cname "kgb.kitenet.net" - & Docker.docked hosts "kgb-server" - & File.hasPrivContentExposed "/etc/kgb-bot/kgb-client.conf" & cname "downloads.kitenet.net" & Apt.buildDep ["git-annex"] `period` Daily From f636e9743adb1a8f7be591d212f50dd92fd7670b Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 12:34:08 -0400 Subject: [PATCH 24/70] propellor spin --- privdata/diatom.kitenet.net.gpg | 362 ++++++++++++++++---------------- privdata/kgb-server.docker.gpg | 27 +++ 2 files changed, 208 insertions(+), 181 deletions(-) create mode 100644 privdata/kgb-server.docker.gpg diff --git a/privdata/diatom.kitenet.net.gpg b/privdata/diatom.kitenet.net.gpg index e52b874..8172333 100644 --- a/privdata/diatom.kitenet.net.gpg +++ b/privdata/diatom.kitenet.net.gpg @@ -1,185 +1,185 @@ -----BEGIN PGP MESSAGE----- Version: GnuPG v1 -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 -=y7k+ +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 +=B2HG -----END PGP MESSAGE----- diff --git a/privdata/kgb-server.docker.gpg b/privdata/kgb-server.docker.gpg new file mode 100644 index 0000000..f052485 --- /dev/null +++ b/privdata/kgb-server.docker.gpg @@ -0,0 +1,27 @@ +-----BEGIN PGP MESSAGE----- +Version: GnuPG v1 + +hQIMA7ODiaEXBlRZAQ//ZDYso8hN4QDNWdv1dCyC38tEVYeuPtUu2/RuGOkzKInz +BlX/aTYtuBHWjpXFWaEVJsvihhvQnJc7nvzguM6wcXPPRBgGMO3/pO9X+81YCmVQ +smqiVyCPaWHxo0X2nmGCfAxRgap/ZpbVyHbS+V0Vh+vIsDYOjz9vXupXrknEocde +6BnxgxKbqIvJUntRlhYhsi0fYkvMSzamlB2Gy7k5iZhwmu95NmTiYSQVPeuwNyYJ +uLlfvSBAFFylg8q50svT0mI4IB2ta7/0V+F5zwSMzlwJ5Jlg7sveWVbHxL274CYk +/mGovgL0CEJ9G4+SayZcb9WwqgGBUWDfBEmYCgkRuAcHM0fmSEBW5OFGzCCdiQ1s +UOeLq/QrXS0hyyD+ug4gb2pKxxXSlm8dVr7hmgD6Lmr1WCdd02equUBnWnXMmZWR +7ewjyZiR36h9SxPtSTG5SP5kinQ/9OerNclJbn/ccgwZAMJyRES9O0wDJ9fum9gY +OzNhsGT6qSgTLRemDnknJjR9pCjCT9e7XdoBnF8IlvbhLYQFuro805+ri7uDxuoP +ELItTFmr+aW12afrQDV/y0fT4701Zs4oZPgqiVmqzRAeBNljdNw13TNTC/rM19Os +GiOsckyARxxolVNA632sb7+HoKXozXVQdxqDj4jlf53/FZpkwVYhXuJOHpklQoHS +wSMBHgPqgvkS40xjLgCuiSmqnahA9l/sH3zoSw8AkSByXbGtHXMXmkTehd0Pb2zY +XbMpXQ1R8Bw3EAykjNQbyZ+c1rMkFrr+KfTPtkTWHDOlKk1WIoN1ldHJvk5dDMoj +V7mGDD0Dbi7CgQHBH044kWCw4X63gClRrr4o+u9jKx/ZyS/gBGvxwz0CGcOM2/rz +t1FpEY01L/ytGBRtZ8S2mDu/M9n4b2SL9ed4ZoV14YPoh7nJBusR23mN+n2T1Fs8 +y+A/P9/Lin+IIKFlMTJK24Z59RrS2B7MC+a0YoSfI0DmBz2DwJHRuJU8q0rWCJLk +/r4EZx8h6Z0Ndrj4w3rmJhEbiWg0rjzcuKIfHIHsEmDBHVomsECnwmj1UKfAaL2A +M75aXTyLFCHKDOsFkdoMozykRX8ut39Hm57m0VFIkl9JRaTrYy3EeE7O6XFMnPbX +uVSS/SfEXIg/S9lR8AiIQMaLOOKnIUdAmEnO7gzZwkAOCEM8iaA0DrgCTkunRUKP +BO9wremAskdHXsT69jKspjvfJckOEJ2nPDdm9nzZFxwsXizUl5EMLcTq9DjI6CrQ +d26hCheOATEQiAr/AdATxQPeAhiK1Fc5b1AmNMDsqdC7tvqEeaFeBktIfxVNgFiI +rC1Ub6M= +=t6f6 +-----END PGP MESSAGE----- From b1fef29248728761e0512d22973c32411036a249 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 12:36:58 -0400 Subject: [PATCH 25/70] propellor spin From 8dd5cb92f8c8c88b1fb87710fa35fd33f68f8ed7 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 12:37:26 -0400 Subject: [PATCH 26/70] propellor spin From b9d2fcc432da003e2c6054a0d6bcbd7eb8457cf0 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 12:57:35 -0400 Subject: [PATCH 27/70] propellor spin --- Propellor/PrivData.hs | 6 +++- privdata/clam.kitenet.net.gpg | 50 ++++++++++++++++++++-------------- privdata/kgb-server.docker.gpg | 27 ------------------ 3 files changed, 34 insertions(+), 49 deletions(-) delete mode 100644 privdata/kgb-server.docker.gpg diff --git a/Propellor/PrivData.hs b/Propellor/PrivData.hs index c7af1aa..ad2c8d2 100644 --- a/Propellor/PrivData.hs +++ b/Propellor/PrivData.hs @@ -8,6 +8,7 @@ import System.FilePath import System.IO import System.Directory import Data.Maybe +import Data.List import Control.Monad import "mtl" Control.Monad.Reader @@ -30,9 +31,12 @@ withPrivData field a = maybe missing a =<< liftIO (getPrivData field) where missing = do host <- getHostName + let host' = if ".docker" `isSuffixOf` host + then "$parent_host" + else host liftIO $ do warningMessage $ "Missing privdata " ++ show field - putStrLn $ "Fix this by running: propellor --set "++host++" '" ++ show field ++ "'" + putStrLn $ "Fix this by running: propellor --set "++host'++" '" ++ show field ++ "'" return FailedChange getPrivData :: PrivDataField -> IO (Maybe String) diff --git a/privdata/clam.kitenet.net.gpg b/privdata/clam.kitenet.net.gpg index 69d8f12..601744c 100644 --- a/privdata/clam.kitenet.net.gpg +++ b/privdata/clam.kitenet.net.gpg @@ -1,25 +1,33 @@ -----BEGIN PGP MESSAGE----- Version: GnuPG v1 -hQIMA7ODiaEXBlRZARAAuRttWmrr3tFgQnbnaQpWxiAQToL94e0SctFiYqiEGRNa -D63/ZaBhBkvKSx57+SyOloqfBaeWM63vd4Yacocypl2zOjC4aEN7/MKyQRl+xhmk -EwQ4kFfJ3dmYrgXt7NAdIarjHsK5/Bv7PGVIrcwD3zqV+FUyuxt2L2ETG61kYo+m -xNWl1NCvHDZ1QOfvw4ldBo7+LO2odzoZAxBF0ZgQFqo/r/6RZaqFNJRLdVTLERTq -E4igjtgfq6blrpyeupKpFu6oy8/7WeBXthnyoduftk+aBTkXWzb+i30zIzNNsc4+ -GE68a5tM0XE8nGwKp4yz0AZHhEYzv+BZXI7HQMAZ+m0srVn637SDHeAgOBU8NjrA -SbZt0ubQ28Qaux7C7awLJ5SjvlQyLT61jLaN6SMcpeLmgkjRVN+eiVOE/qmXzhHv -AobUwJgBOktiN6+WtRcxq7WduNf6Jtxw8UB5gVWiEeg6o+29ZBfIKVMT/Jly4rTO -M13HbmSVzwdGcUL1D7Gf3oY2R7eS4VR8ShCQmF8aB8TXdsw4mo71HnUa7u5N4hCP -jLtJG24+f39TWWRjMQjtFXi5hkep4OG5CBViWdCWOjlfn4Kmr5zCXaunkO9cgDAd -s8UZdmALu2MPoVdcVm+KLq2JQi1jBWEqRu5krx/nSi+eRRX2/y95CKPEPqZoU+rS -wM0BzlW+pEDc7aFlcYCrWTiwO0BWT2iBmbse9/r2NyJPpuFf7GOMI2v65jXQ+avy -1r69zPdAXNgJ19Gid/q1CXCYnYLLVHqigd8XNs12ANaVvkOnBi3gAf309SIPJtCa -uFVBxNasLTMQ3Ta7v7TLa0PopdBuFqfcy9d3BBiOKqokvhWFJobaG/WhF85ercRJ -F8lse9fgo5xfrDoCFk7u9rzhHl8xKLl24thKFTDzwm+yuzXOoLq8+Km/xYuzQXZK -JCjPvIUDaCCc1E/Yeoc3RafAiOuNwnjHW15TRdlohmgXzYlTCYF491WVKQfpL2Sd -VO8Uar094M1d52Rv8/1HCTBKJ0hnK259l4dguzw4sl2BcrFPBz9SJ0f6V/eAHE0h -la5QtLdwDDRI2giMXKfmzRiRA/5kBW01YaK7tt0om6L7Ri4Rs3JAhVgjcWDtH6fI -w807PpsIHaK8r3yDJoeqUnDYOsImuNgdctQkeroPsFYmV3fu5Hb5tYDkKzm5lE0z -C6mz09PD0M5hsnqmZXaw -=UFa1 +hQIMA7ODiaEXBlRZARAAl7WWTjAAI3dGASNptUEGmpWD46DAd/0M5uyw1oS+TUJz +cCTk23jvGeV+eWB+HdVKMsd8EbDYdEbrZxeFrWqlIFq8B+PM1FQ1NEfzigPzcEzR +0Jf+fQWOtki8RIEV7dkH6M4A9oiGQVA6hvR5ShrBEtLp0YR3xGMTFFZ1CZ2khZOi +dm47gWXfbyHnFzRsBnnBBHJ8RSez+McTqP8gHc86SzC2Ey/mJv0ShYaW8an5Aetw +yRhYa5OOGbEbiN+AphZOMyitEFrUGrp1M1kidsBZjgK6bR+9GrMRRZdXzYeyTwUy +1BTXI62SaTYmBroqa4Qt1U8mTxVF+BovOlIjcnK5kKSb2Nu2fu5jRkMHJ8RIh7kJ +eaYLi0adffZrBHBApoX4A+wrpuYdPsVkK6afZ1c7ING+GUuZ4rdUzO5lwjTB9VNV +uGkW+JmCZRA19glyKhGFIom4hkwnAObhxEsuJktOMwokFk4cnzCgb21QWsQZbwdw +Pbq/qosLDsR5Yym7sfo12B5NM4HTMt7Z4ztLpaHfJpfkzDft7bQHjT4zT1kwm/NT +NEA5T5bBKy9acT3Y2yOPE0VM87wr2gMFnHqbFiX+QUQWRAUi2q76w0K7dh5TInOs +hFjMtaz7Iq6vjvQhrHdclHiIuKDF18vndFJAHl8UYVW7XkqgGSSn8runqPcG/t3S +6QEkVzrFvLBroDnG15BuOtMnqcX72WOlX/hIRSNRuHMbUNiGpGrWGiYXKryWVA91 +BLCXY9a63FWKIhJEA/Si27OEA2kjP7h2lEK/jZt1S0gRVaWqpJu+VACBkZNdLcvc +kI6f6dz99ALKlqu4EbZcmWw3D+3Gb/AsWUUwdgKkk6ZWSFzglnXQJ72MXaO2dA4B +axd7peo5qa2Aw2IINrtyDTk9QcxwzuuEbKvl20H/KHT6gGSDey+lYRQac96Iqu9x +LADL9Z8Lv0pN41tFPpq2H9Fe8Lgo9R/sFlQHOMxYNwqbNMKblRXgsmhg3bpZtFbz +TLrqkiasqbnuAej3J1HLrOnYPNXx2WHZRPqZyWTBI2Al89AzYcVMwmLE2fHXF7Ko +cjTPkPv2cvCplbO4uoMVQPHQlQNyXjXR+CJvQ0M+T2jvX69+exx4doPmcp14SM8v +cZrxUILjim3Z9rAcIn7JVu2acslVpRlv1B0ebaWbUMQDxq+rb+mivzUil1ZpJu24 +1RTlF9Sk9xwUqDoaJBUUbWDHc1wrLFzI7/P5MAzBuuGwE5BKlq0cBjzMZpZqUB4x +WCkOrz0aOwXkLqEgbHFkHVu9VuLVrDeY59DIKqEK35t9XiY99FASIJstOAly+UpX +z53lhJKM9oJSrK6FpHu425FpbuJ+kjXWI2bPDRRB2UB8wEP64IzoRlXX34QMltdH +z5NpteD80V1zWKsTHibaJ3wBEpH3iHz7ujnwV4i63uR59YeHY9JWCZ06/t8QSvvh +kYZrBTSEyuxO4FBNb36Tee+0gQO+EhAKilFFf5J91Z3rmTL22T0k/2xwNCMfBeTh +Nvc2jpzM5s5dVDbNnfCVvrj3rvBCYRIBizkjhgJK/l7/FcEYqsUZH4bl1BggOwYY +pSDXzuunt+nsWZa+xfbmS5aKUgsOdnDlu3I7fv3KKHso//7oJJbg5HefAtmEvIvu +Us7SlPjMpx82RUQnJWgmzdML9HfnXFGy+9RRxnFZh4rw72SEzDUc4cOV1KKNeuvf +Q0vxgK8H +=mBZA -----END PGP MESSAGE----- diff --git a/privdata/kgb-server.docker.gpg b/privdata/kgb-server.docker.gpg deleted file mode 100644 index f052485..0000000 --- a/privdata/kgb-server.docker.gpg +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN PGP MESSAGE----- -Version: GnuPG v1 - -hQIMA7ODiaEXBlRZAQ//ZDYso8hN4QDNWdv1dCyC38tEVYeuPtUu2/RuGOkzKInz -BlX/aTYtuBHWjpXFWaEVJsvihhvQnJc7nvzguM6wcXPPRBgGMO3/pO9X+81YCmVQ -smqiVyCPaWHxo0X2nmGCfAxRgap/ZpbVyHbS+V0Vh+vIsDYOjz9vXupXrknEocde -6BnxgxKbqIvJUntRlhYhsi0fYkvMSzamlB2Gy7k5iZhwmu95NmTiYSQVPeuwNyYJ -uLlfvSBAFFylg8q50svT0mI4IB2ta7/0V+F5zwSMzlwJ5Jlg7sveWVbHxL274CYk -/mGovgL0CEJ9G4+SayZcb9WwqgGBUWDfBEmYCgkRuAcHM0fmSEBW5OFGzCCdiQ1s -UOeLq/QrXS0hyyD+ug4gb2pKxxXSlm8dVr7hmgD6Lmr1WCdd02equUBnWnXMmZWR -7ewjyZiR36h9SxPtSTG5SP5kinQ/9OerNclJbn/ccgwZAMJyRES9O0wDJ9fum9gY -OzNhsGT6qSgTLRemDnknJjR9pCjCT9e7XdoBnF8IlvbhLYQFuro805+ri7uDxuoP -ELItTFmr+aW12afrQDV/y0fT4701Zs4oZPgqiVmqzRAeBNljdNw13TNTC/rM19Os -GiOsckyARxxolVNA632sb7+HoKXozXVQdxqDj4jlf53/FZpkwVYhXuJOHpklQoHS -wSMBHgPqgvkS40xjLgCuiSmqnahA9l/sH3zoSw8AkSByXbGtHXMXmkTehd0Pb2zY -XbMpXQ1R8Bw3EAykjNQbyZ+c1rMkFrr+KfTPtkTWHDOlKk1WIoN1ldHJvk5dDMoj -V7mGDD0Dbi7CgQHBH044kWCw4X63gClRrr4o+u9jKx/ZyS/gBGvxwz0CGcOM2/rz -t1FpEY01L/ytGBRtZ8S2mDu/M9n4b2SL9ed4ZoV14YPoh7nJBusR23mN+n2T1Fs8 -y+A/P9/Lin+IIKFlMTJK24Z59RrS2B7MC+a0YoSfI0DmBz2DwJHRuJU8q0rWCJLk -/r4EZx8h6Z0Ndrj4w3rmJhEbiWg0rjzcuKIfHIHsEmDBHVomsECnwmj1UKfAaL2A -M75aXTyLFCHKDOsFkdoMozykRX8ut39Hm57m0VFIkl9JRaTrYy3EeE7O6XFMnPbX -uVSS/SfEXIg/S9lR8AiIQMaLOOKnIUdAmEnO7gzZwkAOCEM8iaA0DrgCTkunRUKP -BO9wremAskdHXsT69jKspjvfJckOEJ2nPDdm9nzZFxwsXizUl5EMLcTq9DjI6CrQ -d26hCheOATEQiAr/AdATxQPeAhiK1Fc5b1AmNMDsqdC7tvqEeaFeBktIfxVNgFiI -rC1Ub6M= -=t6f6 ------END PGP MESSAGE----- From f428ccd9b1fa32fac7415910021be8f51f66857c Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 13:09:48 -0400 Subject: [PATCH 28/70] propellor spin --- config-joey.hs | 22 +++++-------- privdata/clam.kitenet.net.gpg | 58 +++++++++++++++++------------------ 2 files changed, 37 insertions(+), 43 deletions(-) diff --git a/config-joey.hs b/config-joey.hs index ca7a021..9976592 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -48,11 +48,15 @@ hosts = & cname "ancient.kitenet.net" & Docker.docked hosts "ancient-kitenet" - -- I'd rather this container were on diatom, but - -- docker.io is not available in stable. + -- I'd rather this were on diatom, but I use features + -- not available in stable. & cname "kgb.kitenet.net" - & Docker.docked hosts "kgb-server" - + & Apt.serviceInstalledRunning "kgb-bot" + & File.hasPrivContent "/etc/kgb-bot/kgb.conf" + `onChange` Service.restarted "kgb-bot" + & "/etc/default/kgb-bot" `File.containsLine` "BOT_ENABLED=1" + `describe` "kgb bot enabled" + `onChange` Service.running "kgb-bot" & Docker.garbageCollected `period` Daily & Apt.installed ["git-annex", "mtr", "screen"] @@ -127,16 +131,6 @@ hosts = & OpenId.providerFor ["joey", "liw"] "openid.kitenet.net:8081" - -- The kgb irc bot, in a container for security and because I need - -- features not in the stable version. - , standardContainer "kgb-server" Unstable "amd64" - & Docker.publish "9999:9999" - & Apt.serviceInstalledRunning "kgb-bot" - & File.hasPrivContent "/etc/kgb-bot/kgb.conf" - & "/etc/default/kgb-bot" `File.containsLine` "BOT_ENABLED=1" - `describe` "kgb bot enabled" - `onChange` Service.running "kgb-bot" - -- Exhibit: kite's 90's website. , standardContainer "ancient-kitenet" Stable "amd64" & Docker.publish "1994:80" diff --git a/privdata/clam.kitenet.net.gpg b/privdata/clam.kitenet.net.gpg index 601744c..55e7e7d 100644 --- a/privdata/clam.kitenet.net.gpg +++ b/privdata/clam.kitenet.net.gpg @@ -1,33 +1,33 @@ -----BEGIN PGP MESSAGE----- Version: GnuPG v1 -hQIMA7ODiaEXBlRZARAAl7WWTjAAI3dGASNptUEGmpWD46DAd/0M5uyw1oS+TUJz -cCTk23jvGeV+eWB+HdVKMsd8EbDYdEbrZxeFrWqlIFq8B+PM1FQ1NEfzigPzcEzR -0Jf+fQWOtki8RIEV7dkH6M4A9oiGQVA6hvR5ShrBEtLp0YR3xGMTFFZ1CZ2khZOi -dm47gWXfbyHnFzRsBnnBBHJ8RSez+McTqP8gHc86SzC2Ey/mJv0ShYaW8an5Aetw -yRhYa5OOGbEbiN+AphZOMyitEFrUGrp1M1kidsBZjgK6bR+9GrMRRZdXzYeyTwUy -1BTXI62SaTYmBroqa4Qt1U8mTxVF+BovOlIjcnK5kKSb2Nu2fu5jRkMHJ8RIh7kJ -eaYLi0adffZrBHBApoX4A+wrpuYdPsVkK6afZ1c7ING+GUuZ4rdUzO5lwjTB9VNV -uGkW+JmCZRA19glyKhGFIom4hkwnAObhxEsuJktOMwokFk4cnzCgb21QWsQZbwdw -Pbq/qosLDsR5Yym7sfo12B5NM4HTMt7Z4ztLpaHfJpfkzDft7bQHjT4zT1kwm/NT -NEA5T5bBKy9acT3Y2yOPE0VM87wr2gMFnHqbFiX+QUQWRAUi2q76w0K7dh5TInOs -hFjMtaz7Iq6vjvQhrHdclHiIuKDF18vndFJAHl8UYVW7XkqgGSSn8runqPcG/t3S -6QEkVzrFvLBroDnG15BuOtMnqcX72WOlX/hIRSNRuHMbUNiGpGrWGiYXKryWVA91 -BLCXY9a63FWKIhJEA/Si27OEA2kjP7h2lEK/jZt1S0gRVaWqpJu+VACBkZNdLcvc -kI6f6dz99ALKlqu4EbZcmWw3D+3Gb/AsWUUwdgKkk6ZWSFzglnXQJ72MXaO2dA4B -axd7peo5qa2Aw2IINrtyDTk9QcxwzuuEbKvl20H/KHT6gGSDey+lYRQac96Iqu9x -LADL9Z8Lv0pN41tFPpq2H9Fe8Lgo9R/sFlQHOMxYNwqbNMKblRXgsmhg3bpZtFbz -TLrqkiasqbnuAej3J1HLrOnYPNXx2WHZRPqZyWTBI2Al89AzYcVMwmLE2fHXF7Ko -cjTPkPv2cvCplbO4uoMVQPHQlQNyXjXR+CJvQ0M+T2jvX69+exx4doPmcp14SM8v -cZrxUILjim3Z9rAcIn7JVu2acslVpRlv1B0ebaWbUMQDxq+rb+mivzUil1ZpJu24 -1RTlF9Sk9xwUqDoaJBUUbWDHc1wrLFzI7/P5MAzBuuGwE5BKlq0cBjzMZpZqUB4x -WCkOrz0aOwXkLqEgbHFkHVu9VuLVrDeY59DIKqEK35t9XiY99FASIJstOAly+UpX -z53lhJKM9oJSrK6FpHu425FpbuJ+kjXWI2bPDRRB2UB8wEP64IzoRlXX34QMltdH -z5NpteD80V1zWKsTHibaJ3wBEpH3iHz7ujnwV4i63uR59YeHY9JWCZ06/t8QSvvh -kYZrBTSEyuxO4FBNb36Tee+0gQO+EhAKilFFf5J91Z3rmTL22T0k/2xwNCMfBeTh -Nvc2jpzM5s5dVDbNnfCVvrj3rvBCYRIBizkjhgJK/l7/FcEYqsUZH4bl1BggOwYY -pSDXzuunt+nsWZa+xfbmS5aKUgsOdnDlu3I7fv3KKHso//7oJJbg5HefAtmEvIvu -Us7SlPjMpx82RUQnJWgmzdML9HfnXFGy+9RRxnFZh4rw72SEzDUc4cOV1KKNeuvf -Q0vxgK8H -=mBZA +hQIMA7ODiaEXBlRZAQ/7BbCEPQ1yR8QnUbwDYhPJJluk99TSKik60p7k+CM+a2gK +03eTj2JmSvFFiMXDfJaMPy+qYWlZukm0pYsw60mO9FqLxfppg9JFY1/G0RdgILgE +sHm3L0HyGR5HuymO1Ye0WMzF3bhBxhym490nl8XNex0R9baRgfMw7lsFlYZ5NhbW +Jnrj/iK6gcbPsMuMT3cvjKLIo6Z22ekjlP4c6shEpzSWSl3d0ge5XEN8gj0hEUv7 ++2UqUz52IZdK1T1yDIobUTX64VKANzO6TfnoCgy+76pT3wyT6U41kROL8XhvcfaC +/L9M3aGKxY2H9RPtw52UIlM0o5sUMlgmRUwnpQmb3AO9JYKd3tCeMp2xK8jguA1I +3p7vDaJi/Z+PMKuBZzjpBym0jv+louqnkeS+d65KIAsY0LTmnnaTyGJMX2PiOouW +fRdJA+UmSpum3mnE3g0ye7BBeC0WNrBL+RyuvRk4pPWuv3QL+TvbVi/HmagHgFjq +zKlWzcs3eqp5trNjqa+1eK4C+ZwrYqDLS7kX7jpj4I/qzXP8xinN1kJhL5zMYiLU +XCDrcPQYj8dTzMrmBY0L2X4nthT100Tl7CahBYl5cTDF7c3FK62sF7kgqy3gysny +MxwaU5U/OehZAGAiJTuSKnw0Yxl6iEIHTaWOryYSaNJpOHYrQTYkSVoe1aEsg4bS +6QHko/AxhWyUP9isosGNlfV0AxAe5MfjxRIKbbv/9+UPLkFJ7SPU9P8UD3F/Kttc +r83L3SWdmrKSTpEF70vj6X0csP9KQdfh2CiZdHPdMsfcW2OOoxlaosvtAr5fu4Dk +D3Rjc2A+mVSJqTDENONXyFSZqk1cP23yWsA+AH5Cfoznj98rJrm5ZXjX5t0SHBJW +Yc6PHgzY6/cvHIBmF7QuxEB+3yyv9r3flQQQnfBg28/n5fbmcUoD03+MQRc3BHd9 +E4x1MPeQ5WrHq2wFCy1gL7llrjjSszkH0Vqr3ObNbejowBWbe2EKDio4I14wxWk9 +lrLZXs32nuS+wP5/DqztP3OlKb0HJc8TYas1CiwMFTmW1HmU6nYVkV7ZLs0yGy9a +/dQCGyasKO26EugQj3rvK/cvGw+QNw6qGwR0+InO929souh8Ugoy12SbHRPNtdHk +N+EIox9tNYGapa1ZYL0OuPZgvDnaSdtB7U9lbeOOH1zr4RjMVPxzMY4rai3A59Nb +RQJNvQ23ij9u+Tn7j42/Du18IB8yZe3aZPEgyiDbZmqJADARrmUF+x483piWaGZD +5G2D7JZfeSoT1BrsSBSxiJQ386z+wrfKzGIMabkswsX/TLoFwRZDwysb/cQiAuZV +ymLI+lXH6G5ZzYWYi6WRGOjPPQpk6/rC6UlNQyiw5TLuwFtdOQSjsOhZ9M8WW0hz +ykCMO43kjmSBvNOBz0clgsvxTW4ulRVrU4lZu5orseFGn9YvaJlklDKioWCxSJL0 +6diWBTgdVsIGKCpT5jr7+19BnBaP3JJy0k947S/8e0ACjb5nPiKtSxn1lj4Hnpvf +Cev1XvzLaWVM9DTntxGBIa82uYcCpWDxffPE7d1DcAaxNhCFqYIAU+aI6V+OqfvT +HfV5Pu6aN5yteP/K7gqRNmdgSWf1OiH5qCcHvBjeZBs6M5dhFVgIYCmvvyuxjyRu +T2qdkeoLnZUiiMWeBNbJRhxokZ8tZwC9W85EObT+cGkF+pRfQZt7jISi74syF+3C +dkTJkUR/IItJ5OGrRegKNNloctGtws3jmo7wGpWt +=5jg6 -----END PGP MESSAGE----- From 1495db6cd103bf5f9f4635dbbfe807c7c1f39b2e Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 14:01:30 -0400 Subject: [PATCH 29/70] propellor spin --- Propellor/Property/Apache.hs | 28 ++++++ Propellor/Property/File.hs | 9 +- Propellor/Property/SiteSpecific/JoeySites.hs | 92 ++++++++++++++++++++ config-joey.hs | 38 ++------ debian/changelog | 1 + propellor.cabal | 1 + 6 files changed, 136 insertions(+), 33 deletions(-) create mode 100644 Propellor/Property/Apache.hs diff --git a/Propellor/Property/Apache.hs b/Propellor/Property/Apache.hs new file mode 100644 index 0000000..5e32b0d --- /dev/null +++ b/Propellor/Property/Apache.hs @@ -0,0 +1,28 @@ +module Propellor.Property.Apache where + +import Propellor +import qualified Propellor.Property.File as File +import qualified Propellor.Property.Apt as Apt + +type ConfigFile = [String] + +siteEnabled :: HostName -> ConfigFile -> RevertableProperty +siteEnabled hn cf = RevertableProperty enable disable + where + enable = siteAvailable hn cf + `onChange` cmdProperty "a2ensite" ["--quiet", hn] + `requires` Apt.installed ["apache2"] + disable = File.notPresent (siteCfg hn) + `onChange` cmdProperty "a2dissite" ["--quiet", hn] + +siteAvailable :: HostName -> ConfigFile -> Property +siteAvailable hn cf = siteCfg hn `File.hasContent` (comment:cf) + `describe` ("apache site available " ++ hn) + where + comment = "# deployed with propellor, do not modify" + +siteCfg :: HostName -> FilePath +siteCfg hn = "/etc/apache2/sites-available/" ++ hn ++ ".conf" + +restart :: Property +restart = cmdProperty "service" ["apache2", "restart"] diff --git a/Propellor/Property/File.hs b/Propellor/Property/File.hs index bd33c9b..8f23dab 100644 --- a/Propellor/Property/File.hs +++ b/Propellor/Property/File.hs @@ -31,11 +31,14 @@ hasPrivContentExposed f = hasPrivContent f `onChange` -- | 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) go f +f `containsLine` l = f `containsLines` [l] + +containsLines :: FilePath -> [Line] -> Property +f `containsLines` l = fileProperty (f ++ " contains:" ++ show l) go f where go ls - | l `elem` ls = ls - | otherwise = ls++[l] + | all (`elem` ls) l = 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 diff --git a/Propellor/Property/SiteSpecific/JoeySites.hs b/Propellor/Property/SiteSpecific/JoeySites.hs index 4637317..81557b3 100644 --- a/Propellor/Property/SiteSpecific/JoeySites.hs +++ b/Propellor/Property/SiteSpecific/JoeySites.hs @@ -5,6 +5,14 @@ module Propellor.Property.SiteSpecific.JoeySites where import Propellor import qualified Propellor.Property.Apt as Apt +import qualified Propellor.Property.File as File +import qualified Propellor.Property.Gpg as Gpg +import qualified Propellor.Property.Ssh as Ssh +import qualified Propellor.Property.Git as Git +import qualified Propellor.Property.Service as Service +import qualified Propellor.Property.User as User +import qualified Propellor.Property.Obnam as Obnam +import qualified Propellor.Property.Apache as Apache oldUseNetShellBox :: Property oldUseNetShellBox = check (not <$> Apt.isInstalled "oldusenet") $ @@ -21,3 +29,87 @@ oldUseNetShellBox = check (not <$> Apt.isInstalled "oldusenet") $ , "rm -rf /root/tmp/oldusenet" ] `describe` "olduse.net built" ] + +-- git.kitenet.net and git.joeyh.name +gitServer :: [Host] -> Property +gitServer hosts = propertyList "git.kitenet.net setup" + [ Obnam.backup "/srv/git" "33 3 * * *" + [ "--repository=sftp://2318@usw-s002.rsync.net/~/git.kitenet.net" + , "--encrypt-with=1B169BE1" + , "--client-name=wren" + ] Obnam.OnlyClient + `requires` Gpg.keyImported "1B169BE1" "root" + `requires` Ssh.keyImported SshRsa "root" + `requires` Ssh.knownHost hosts "usw-s002.rsync.net" "root" + `requires` Ssh.authorizedKeys "family" + `requires` User.accountFor "family" + , Apt.installed ["git", "git-annex", "rsync", "kgb-client-git", "gitweb"] + , File.hasPrivContentExposed "/etc/kgb-bot/kgb-client.conf" + , toProp $ Git.daemonRunning "/srv/git" + , "/etc/gitweb.conf" `File.containsLines` + [ "$projectroot = 'srv/git';" + , "@git_base_url_list = ('git://git.kitenet.net', 'http://git.kitenet.net/git', 'ssh://git.kitenet.net/srv/git');" + , "# disable snapshot download; overloads server" + , "$feature{'snapshot'}{'default'} = [];" + ] + `describe` "gitweb configured" + , website "git.kitenet.net" + , website "git.joeyh.name" + -- ssh keys for branchable and github repo hooks + -- TODO: upgrade to newer git-annex-shell for notification + -- gitweb + ] + where + website hn = toProp $ Apache.siteEnabled hn (gitapacheconf hn) + +gitapacheconf :: HostName -> Apache.ConfigFile +gitapacheconf hn = + [ "" + , " ServerAdmin joey@kitenet.net" + , "" + , " ServerName " ++ hn ++ ":80" + , "" + , " DocumentRoot /srv/web/git.kitenet.net/" + , " " + , " Options Indexes ExecCGI FollowSymlinks" + , " AllowOverride None" + , " DirectoryIndex index.cgi" + , " " + , "" + , " ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/" + , " " + , " SetHandler cgi-script" + , " Options ExecCGI" + , " " + , "" + , " ErrorLog /var/log/apache2/error.log" + , " LogLevel warn" + , " CustomLog /var/log/apache2/access.log combined" + , "" + , " # Possible values include: debug, info, notice, warn, error, crit," + , " # alert, emerg." + , " LogLevel warn" + , "" + , " CustomLog /var/log/apache2/access.log combined" + , " ServerSignature On" + , " " + , " " + , " Options Indexes MultiViews" + , " AllowOverride None" + , " Order allow,deny" + , " Allow from all" + , " " + , "" + ] + +-- Note: needs debian unstable for new kgb +kgbServer :: Property +kgbServer = propertyList "kgb.kitenet.net setup" + [ Apt.serviceInstalledRunning "kgb-bot" + , File.hasPrivContent "/etc/kgb-bot/kgb.conf" + `onChange` Service.restarted "kgb-bot" + , "/etc/default/kgb-bot" `File.containsLine` "BOT_ENABLED=1" + `describe` "kgb bot enabled" + `onChange` Service.running "kgb-bot" + ] + diff --git a/config-joey.hs b/config-joey.hs index 9976592..aba648d 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -5,7 +5,6 @@ import Propellor.CmdLine import Propellor.Property.Scheduled import qualified Propellor.Property.File as File import qualified Propellor.Property.Apt as Apt -import qualified Propellor.Property.Service as Service import qualified Propellor.Property.Network as Network import qualified Propellor.Property.Ssh as Ssh import qualified Propellor.Property.Cron as Cron @@ -18,8 +17,6 @@ import qualified Propellor.Property.Dns as Dns import qualified Propellor.Property.OpenId as OpenId import qualified Propellor.Property.Docker as Docker import qualified Propellor.Property.Git as Git -import qualified Propellor.Property.Gpg as Gpg -import qualified Propellor.Property.Obnam as Obnam import qualified Propellor.Property.SiteSpecific.GitHome as GitHome import qualified Propellor.Property.SiteSpecific.GitAnnexBuilder as GitAnnexBuilder import qualified Propellor.Property.SiteSpecific.JoeySites as JoeySites @@ -48,15 +45,10 @@ hosts = & cname "ancient.kitenet.net" & Docker.docked hosts "ancient-kitenet" - -- I'd rather this were on diatom, but I use features - -- not available in stable. + -- I'd rather this were on diatom, but it needs unstable. & cname "kgb.kitenet.net" - & Apt.serviceInstalledRunning "kgb-bot" - & File.hasPrivContent "/etc/kgb-bot/kgb.conf" - `onChange` Service.restarted "kgb-bot" - & "/etc/default/kgb-bot" `File.containsLine` "BOT_ENABLED=1" - `describe` "kgb bot enabled" - `onChange` Service.running "kgb-bot" + & JoeySites.kgbServer + & Docker.garbageCollected `period` Daily & Apt.installed ["git-annex", "mtr", "screen"] @@ -75,31 +67,17 @@ hosts = -- Important stuff that needs not too much memory or CPU. , standardSystem "diatom.kitenet.net" Stable & Hostname.sane + & Ssh.hostKey SshDsa + & Ssh.hostKey SshRsa + & Ssh.hostKey SshEcdsa & Apt.unattendedUpgrades & Apt.serviceInstalledRunning "ntp" & Dns.zones myDnsSecondary & Apt.serviceInstalledRunning "apache2" & cname "git.kitenet.net" - & Ssh.hostKey SshDsa - & Ssh.hostKey SshRsa - & Ssh.hostKey SshEcdsa - & Obnam.backup "/srv/git" "33 3 * * *" - [ "--repository=sftp://2318@usw-s002.rsync.net/~/git.kitenet.net" - , "--encrypt-with=1B169BE1" - , "--client-name=wren" - ] Obnam.OnlyClient - `requires` Gpg.keyImported "1B169BE1" "root" - `requires` Ssh.keyImported SshRsa "root" - `requires` Ssh.knownHost hosts "usw-s002.rsync.net" "root" - `requires` Ssh.authorizedKeys "family" - `requires` User.accountFor "family" - & Apt.installed ["git", "git-annex", "rsync", "kgb-client-git"] - & File.hasPrivContentExposed "/etc/kgb-bot/kgb-client.conf" - & Git.daemonRunning "/srv/git" - -- ssh keys for branchable and github repo hooks - -- TODO: upgrade to newer git-annex-shell for notification - -- gitweb + & cname "git.joeyh.name" + & JoeySites.gitServer hosts & cname "downloads.kitenet.net" & Apt.buildDep ["git-annex"] `period` Daily diff --git a/debian/changelog b/debian/changelog index 6593c95..b3cc554 100644 --- a/debian/changelog +++ b/debian/changelog @@ -3,6 +3,7 @@ propellor (0.3.1) UNRELEASED; urgency=medium * Merge scheduler bug fix from git-annex. * Support for provisioning hosts with ssh and gpg keys. * Obnam support. + * Apache support. -- Joey Hess Fri, 11 Apr 2014 15:00:11 -0400 diff --git a/propellor.cabal b/propellor.cabal index cc616c1..a7b7fbc 100644 --- a/propellor.cabal +++ b/propellor.cabal @@ -68,6 +68,7 @@ Library Exposed-Modules: Propellor Propellor.Property + Propellor.Property.Apache Propellor.Property.Apt Propellor.Property.Cmd Propellor.Property.Hostname From 8372362a979c92ffce93c21fab308a49e1b17c05 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 14:01:40 -0400 Subject: [PATCH 30/70] propellor spin From 4dac4eea222c5fa8a0cfcb5a4959dd3832a86188 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 14:04:25 -0400 Subject: [PATCH 31/70] propellor spin --- privdata/clam.kitenet.net.gpg | 58 +++++++++++++++++------------------ 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/privdata/clam.kitenet.net.gpg b/privdata/clam.kitenet.net.gpg index 55e7e7d..a486e82 100644 --- a/privdata/clam.kitenet.net.gpg +++ b/privdata/clam.kitenet.net.gpg @@ -1,33 +1,33 @@ -----BEGIN PGP MESSAGE----- Version: GnuPG v1 -hQIMA7ODiaEXBlRZAQ/7BbCEPQ1yR8QnUbwDYhPJJluk99TSKik60p7k+CM+a2gK -03eTj2JmSvFFiMXDfJaMPy+qYWlZukm0pYsw60mO9FqLxfppg9JFY1/G0RdgILgE -sHm3L0HyGR5HuymO1Ye0WMzF3bhBxhym490nl8XNex0R9baRgfMw7lsFlYZ5NhbW -Jnrj/iK6gcbPsMuMT3cvjKLIo6Z22ekjlP4c6shEpzSWSl3d0ge5XEN8gj0hEUv7 -+2UqUz52IZdK1T1yDIobUTX64VKANzO6TfnoCgy+76pT3wyT6U41kROL8XhvcfaC -/L9M3aGKxY2H9RPtw52UIlM0o5sUMlgmRUwnpQmb3AO9JYKd3tCeMp2xK8jguA1I -3p7vDaJi/Z+PMKuBZzjpBym0jv+louqnkeS+d65KIAsY0LTmnnaTyGJMX2PiOouW -fRdJA+UmSpum3mnE3g0ye7BBeC0WNrBL+RyuvRk4pPWuv3QL+TvbVi/HmagHgFjq -zKlWzcs3eqp5trNjqa+1eK4C+ZwrYqDLS7kX7jpj4I/qzXP8xinN1kJhL5zMYiLU -XCDrcPQYj8dTzMrmBY0L2X4nthT100Tl7CahBYl5cTDF7c3FK62sF7kgqy3gysny -MxwaU5U/OehZAGAiJTuSKnw0Yxl6iEIHTaWOryYSaNJpOHYrQTYkSVoe1aEsg4bS -6QHko/AxhWyUP9isosGNlfV0AxAe5MfjxRIKbbv/9+UPLkFJ7SPU9P8UD3F/Kttc -r83L3SWdmrKSTpEF70vj6X0csP9KQdfh2CiZdHPdMsfcW2OOoxlaosvtAr5fu4Dk -D3Rjc2A+mVSJqTDENONXyFSZqk1cP23yWsA+AH5Cfoznj98rJrm5ZXjX5t0SHBJW -Yc6PHgzY6/cvHIBmF7QuxEB+3yyv9r3flQQQnfBg28/n5fbmcUoD03+MQRc3BHd9 -E4x1MPeQ5WrHq2wFCy1gL7llrjjSszkH0Vqr3ObNbejowBWbe2EKDio4I14wxWk9 -lrLZXs32nuS+wP5/DqztP3OlKb0HJc8TYas1CiwMFTmW1HmU6nYVkV7ZLs0yGy9a -/dQCGyasKO26EugQj3rvK/cvGw+QNw6qGwR0+InO929souh8Ugoy12SbHRPNtdHk -N+EIox9tNYGapa1ZYL0OuPZgvDnaSdtB7U9lbeOOH1zr4RjMVPxzMY4rai3A59Nb -RQJNvQ23ij9u+Tn7j42/Du18IB8yZe3aZPEgyiDbZmqJADARrmUF+x483piWaGZD -5G2D7JZfeSoT1BrsSBSxiJQ386z+wrfKzGIMabkswsX/TLoFwRZDwysb/cQiAuZV -ymLI+lXH6G5ZzYWYi6WRGOjPPQpk6/rC6UlNQyiw5TLuwFtdOQSjsOhZ9M8WW0hz -ykCMO43kjmSBvNOBz0clgsvxTW4ulRVrU4lZu5orseFGn9YvaJlklDKioWCxSJL0 -6diWBTgdVsIGKCpT5jr7+19BnBaP3JJy0k947S/8e0ACjb5nPiKtSxn1lj4Hnpvf -Cev1XvzLaWVM9DTntxGBIa82uYcCpWDxffPE7d1DcAaxNhCFqYIAU+aI6V+OqfvT -HfV5Pu6aN5yteP/K7gqRNmdgSWf1OiH5qCcHvBjeZBs6M5dhFVgIYCmvvyuxjyRu -T2qdkeoLnZUiiMWeBNbJRhxokZ8tZwC9W85EObT+cGkF+pRfQZt7jISi74syF+3C -dkTJkUR/IItJ5OGrRegKNNloctGtws3jmo7wGpWt -=5jg6 +hQIMA7ODiaEXBlRZARAAwRCedlPz0UfWaS+CXyFA/LEFNoLlGhYsDSHaNcxC6Y9x +0APA5VjbsAPagOOgHXLLpJrSOtGoA42amKvpsNpUf8XOwMb/AkQKEgfQ2bMeEMrf +PHPOQxU79ouXBkEn2DXcrG4txSky0C/kEt2JmuHI6LJk0phnLs9NvrL4XaE2Dspz +R8ZfTxPHzmt/yJr9allDokFGSoNOiapcOisyRW9F1sqGAS4C0WDCOFqiGtdXOdVN +wvhkompsHUnxLHg3oNVgh2WHGjjgos2CKHNF7KpD/vzfEV9++7yH2Y9094M2Dn2m +buj1XIORSlmxBKTVpw2PN0uI01QgX6hQ9YpDvozMFdQPvZwbBVDBa5rvdJg9nv6Z +usy38x9C/Ry7RL2EFR0jJ32WQCAbMDR5hTZ9owjg1adUTlj8wWgBqP3NOWsEQBit +aaqTmsuXKva7IBldLR357DSCGFefkTdyKzxY36J26lrbco2mhm83k7Z+JaSo7myN +8x/Rm86Y5J4iICWjzqtdpg2hjlJAJAYcLFLe5r26t4VaCeDPWM0nQetZzDR/vb0B +hisNPJm6NoTt71lTvHZA/+4xk5pH+ua3EnTA+u1qC6OAh9eoGZSeLI7VCsCVL8U/ +Tvo/mXknfN7VmpUNSmRiePBfshyi4Ckd+Pgc2XJFa/8tiPPRqyXkEercDZI4I+DS +6QHX0cfvNgK7f9nDJkFx5T9kP/l0OlACLnMbnUjoe4l3uFoIb02akrM9+Q+2KW6L +vzies7WuKNDNlnb08M1u9pB3ShDfs6SfHntSzVBdnCdWwgLveBoqwx8NXP5jTr8j +TrP9H0Bp9uh63EkbBlcUThjkMob9mxHtk6y0pz/xvzNukELvQtfsIBiLde7A7ymV +mmnRkfS7QKf/EUnw6C+DtT0JsXRgpDy1YS+l5rrzuqL+9AyRIJzbTH0MAkkqnvCI +bNH3ogPI657J50AXCPZbFfDiU3k0RYuXbY9yDaxLJi/3+TEdOEGcVdbu4pOO5D2f +OcbJrWq5vk/ifQuoMpqNCHnWzHuVIeARCOmd3tOC5wV5Ae73C80oh36lYVYxyu9U +s1mHN+PyUFS2F4MBDWu9DhxGlzO5MJIQYiBy1SMEkrWj71ngpAqii33F2B+vIQmx +VObBZs8upPrIswGzc9Xa2eYKkd2xASNmynqGo/tsTn3j4vKXSPdRUuPFUxNXuTt4 +ClLyf12P8Kgbd5tB/Jm9r1c+yHjowg0d6u9zhyhi9Aklg1jgFTRYauiwQLxOWZ4H +yuhPSgI91ySKJBqH+YJg9Bzb7dYVX8UNOZSBRz9U18RCUxMzpsmhcHC2tFrr9FRN +FOyD7kX1O7DUkLTFPDjZZTbO5LmYaEqHi+ptriJyX9/2wE2qiDUWCbIji/1vqCmT +2saPIS/UdIoNR9c6q9ws3XRKHhkRI8QZTQd+Jcx0xwzqOMnHnnRw8jselfSHtTL4 +1GV/K5SQp0+ZzYnC67Qu0nJrqfM7eH7e6n1j+dgV1LkLKwunZ5sQU9KF84+NncA7 +QhED0ppL4bClg1N/VLVOhPlzorUHds4np2wIorCVoS2XqjPUIFNlmfWlwZRd5P/p +Po70TktbtifqNBrl5KU2SmM/lRjJeU/RJl4NSsnvA8m3A7mvIuB9fWmVkjmoepi6 +r+HhYXFdkcz6w3BYOJjNM18zKEuxSffcgwjtxPO7a+RvyreRhPxuBXYCsLn1FeDT +gdM492sCouTWKUpECPJEjw== +=2knt -----END PGP MESSAGE----- From 2e128c8fe25fb92ecfbd0bbe79ea777d53fa11ca Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 14:12:11 -0400 Subject: [PATCH 32/70] propellor spin --- Propellor/Property/Git.hs | 6 ++++-- Propellor/Property/SiteSpecific/JoeySites.hs | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Propellor/Property/Git.hs b/Propellor/Property/Git.hs index 6541dc7..431f413 100644 --- a/Propellor/Property/Git.hs +++ b/Propellor/Property/Git.hs @@ -75,8 +75,10 @@ cloned owner url dir mbranch = check originurl (Property desc checkout) , return True ) checkout = do - liftIO $ whenM (doesDirectoryExist dir) $ - removeDirectoryRecursive dir + liftIO $ do + whenM (doesDirectoryExist dir) $ + removeDirectoryRecursive dir + createDirectoryIfMissing True (takeDirectory dir) ensureProperty $ userScriptProperty owner $ catMaybes [ Just $ "git clone " ++ shellEscape url ++ " " ++ shellEscape dir , Just $ "cd " ++ shellEscape dir diff --git a/Propellor/Property/SiteSpecific/JoeySites.hs b/Propellor/Property/SiteSpecific/JoeySites.hs index 81557b3..fa44416 100644 --- a/Propellor/Property/SiteSpecific/JoeySites.hs +++ b/Propellor/Property/SiteSpecific/JoeySites.hs @@ -53,11 +53,12 @@ gitServer hosts = propertyList "git.kitenet.net setup" , "$feature{'snapshot'}{'default'} = [];" ] `describe` "gitweb configured" + -- I keep the website used for gitweb checked into git.. + , Git.cloned "joey" "/srv/git/joey/git.kitenet.net.git" "/srv/web/git.kitenet.net" Nothing , website "git.kitenet.net" , website "git.joeyh.name" -- ssh keys for branchable and github repo hooks -- TODO: upgrade to newer git-annex-shell for notification - -- gitweb ] where website hn = toProp $ Apache.siteEnabled hn (gitapacheconf hn) From 8fb347b694378a4445106dec400bde0584593b1b Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 14:13:26 -0400 Subject: [PATCH 33/70] propellor spin --- Propellor/Property/SiteSpecific/JoeySites.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Propellor/Property/SiteSpecific/JoeySites.hs b/Propellor/Property/SiteSpecific/JoeySites.hs index fa44416..907233b 100644 --- a/Propellor/Property/SiteSpecific/JoeySites.hs +++ b/Propellor/Property/SiteSpecific/JoeySites.hs @@ -54,7 +54,7 @@ gitServer hosts = propertyList "git.kitenet.net setup" ] `describe` "gitweb configured" -- I keep the website used for gitweb checked into git.. - , Git.cloned "joey" "/srv/git/joey/git.kitenet.net.git" "/srv/web/git.kitenet.net" Nothing + , Git.cloned "root" "/srv/git/joey/git.kitenet.net.git" "/srv/web/git.kitenet.net" Nothing , website "git.kitenet.net" , website "git.joeyh.name" -- ssh keys for branchable and github repo hooks From 70a5e9fe7b441440e1634e93aebbfb4c85c230aa Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 14:15:49 -0400 Subject: [PATCH 34/70] propellor spin --- Propellor/Property/Git.hs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Propellor/Property/Git.hs b/Propellor/Property/Git.hs index 431f413..24feabd 100644 --- a/Propellor/Property/Git.hs +++ b/Propellor/Property/Git.hs @@ -80,7 +80,8 @@ cloned owner url dir mbranch = check originurl (Property desc checkout) removeDirectoryRecursive dir createDirectoryIfMissing True (takeDirectory dir) ensureProperty $ userScriptProperty owner $ catMaybes - [ Just $ "git clone " ++ shellEscape url ++ " " ++ shellEscape dir + [ Just "set -x" + , Just $ "git clone " ++ shellEscape url ++ " " ++ shellEscape dir , Just $ "cd " ++ shellEscape dir , ("git checkout " ++) <$> mbranch ] From 3835e6b1c7cdb7ba2ed14bf872331bf44f95cb17 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 14:18:31 -0400 Subject: [PATCH 35/70] propellor spin --- Propellor/Property/Git.hs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Propellor/Property/Git.hs b/Propellor/Property/Git.hs index 24feabd..431f413 100644 --- a/Propellor/Property/Git.hs +++ b/Propellor/Property/Git.hs @@ -80,8 +80,7 @@ cloned owner url dir mbranch = check originurl (Property desc checkout) removeDirectoryRecursive dir createDirectoryIfMissing True (takeDirectory dir) ensureProperty $ userScriptProperty owner $ catMaybes - [ Just "set -x" - , Just $ "git clone " ++ shellEscape url ++ " " ++ shellEscape dir + [ Just $ "git clone " ++ shellEscape url ++ " " ++ shellEscape dir , Just $ "cd " ++ shellEscape dir , ("git checkout " ++) <$> mbranch ] From a829889e956890e29676de6addea9e53e704eb83 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 14:21:05 -0400 Subject: [PATCH 36/70] propellor spin --- Propellor/CmdLine.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Propellor/CmdLine.hs b/Propellor/CmdLine.hs index 5be91c4..b58179f 100644 --- a/Propellor/CmdLine.hs +++ b/Propellor/CmdLine.hs @@ -174,7 +174,7 @@ spin hn = do cacheparams <- toCommand <$> sshCachingParams hn go cacheparams url =<< gpgDecrypt (privDataFile hn) where - go cacheparams url privdata = withBothHandles createProcessSuccess (proc "ssh" $ cacheparams ++ [user, bootstrapcmd]) $ \(toh, fromh) -> do + go cacheparams url privdata = withBothHandles createProcessSuccess (proc "ssh" $ cacheparams ++ ["-t", user, bootstrapcmd]) $ \(toh, fromh) -> do let finish = do senddata toh (privDataFile hn) privDataMarker privdata hClose toh From dc502f8547a03ba43006970508ab2bb78fe9bb97 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 14:21:52 -0400 Subject: [PATCH 37/70] propellor spin From 4b6b0e9ce16b68523feb9535aae751a0de6539e4 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 14:22:27 -0400 Subject: [PATCH 38/70] propellor spin From c1307f5dc26b96e61743f590df5797999ca82d92 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 14:23:17 -0400 Subject: [PATCH 39/70] propellor spin --- Propellor/Property/Git.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Propellor/Property/Git.hs b/Propellor/Property/Git.hs index 431f413..b2a5380 100644 --- a/Propellor/Property/Git.hs +++ b/Propellor/Property/Git.hs @@ -80,7 +80,7 @@ cloned owner url dir mbranch = check originurl (Property desc checkout) removeDirectoryRecursive dir createDirectoryIfMissing True (takeDirectory dir) ensureProperty $ userScriptProperty owner $ catMaybes - [ Just $ "git clone " ++ shellEscape url ++ " " ++ shellEscape dir + [ Just $ "git clone " ++ shellEscape url ++ " " ++ shellEscape dir ++ " < /dev/null" , Just $ "cd " ++ shellEscape dir , ("git checkout " ++) <$> mbranch ] From 5c75e5ec6c6edbe1a221cdcd759fbc650e74f6f1 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 14:23:42 -0400 Subject: [PATCH 40/70] propellor spin From 96f07ef513f6447baec8f66d52d4490ef627a588 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 14:36:19 -0400 Subject: [PATCH 41/70] propellor spin --- Propellor/Property/Apache.hs | 34 ++++++++++++++++---- Propellor/Property/Git.hs | 3 ++ Propellor/Property/SiteSpecific/JoeySites.hs | 1 + 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/Propellor/Property/Apache.hs b/Propellor/Property/Apache.hs index 5e32b0d..81daf9e 100644 --- a/Propellor/Property/Apache.hs +++ b/Propellor/Property/Apache.hs @@ -3,17 +3,21 @@ module Propellor.Property.Apache where import Propellor import qualified Propellor.Property.File as File import qualified Propellor.Property.Apt as Apt +import qualified Propellor.Property.Service as Service type ConfigFile = [String] siteEnabled :: HostName -> ConfigFile -> RevertableProperty siteEnabled hn cf = RevertableProperty enable disable where - enable = siteAvailable hn cf - `onChange` cmdProperty "a2ensite" ["--quiet", hn] - `requires` Apt.installed ["apache2"] + enable = cmdProperty "a2ensite" ["--quiet", hn] + `requires` siteAvailable hn cf + `requires` installed + `onChange` reloaded disable = File.notPresent (siteCfg hn) `onChange` cmdProperty "a2dissite" ["--quiet", hn] + `requires` installed + `onChange` reloaded siteAvailable :: HostName -> ConfigFile -> Property siteAvailable hn cf = siteCfg hn `File.hasContent` (comment:cf) @@ -21,8 +25,24 @@ siteAvailable hn cf = siteCfg hn `File.hasContent` (comment:cf) where comment = "# deployed with propellor, do not modify" -siteCfg :: HostName -> FilePath -siteCfg hn = "/etc/apache2/sites-available/" ++ hn ++ ".conf" +modEnabled :: String -> RevertableProperty +modEnabled modname = RevertableProperty enable disable + where + enable = cmdProperty "a2enmod" ["--quiet", modname] + `requires` installed + `onChange` reloaded + disable = cmdProperty "a2dismod" ["--quiet", modname] + `requires` installed + `onChange` reloaded -restart :: Property -restart = cmdProperty "service" ["apache2", "restart"] +siteCfg :: HostName -> FilePath +siteCfg hn = "/etc/apache2/sites-available/" ++ hn + +installed :: Property +installed = Apt.installed ["apache2"] + +restarted :: Property +restarted = cmdProperty "service" ["apache2", "restart"] + +reloaded :: Property +reloaded = Service.reloaded "apache2" diff --git a/Propellor/Property/Git.hs b/Propellor/Property/Git.hs index b2a5380..1dae94b 100644 --- a/Propellor/Property/Git.hs +++ b/Propellor/Property/Git.hs @@ -80,6 +80,9 @@ cloned owner url dir mbranch = check originurl (Property desc checkout) removeDirectoryRecursive dir createDirectoryIfMissing True (takeDirectory dir) ensureProperty $ userScriptProperty owner $ catMaybes + -- The mbranch diff --git a/Propellor/Property/SiteSpecific/JoeySites.hs b/Propellor/Property/SiteSpecific/JoeySites.hs index 907233b..4b98fe0 100644 --- a/Propellor/Property/SiteSpecific/JoeySites.hs +++ b/Propellor/Property/SiteSpecific/JoeySites.hs @@ -57,6 +57,7 @@ gitServer hosts = propertyList "git.kitenet.net setup" , Git.cloned "root" "/srv/git/joey/git.kitenet.net.git" "/srv/web/git.kitenet.net" Nothing , website "git.kitenet.net" , website "git.joeyh.name" + , toProp $ Apache.modEnabled "cgi" -- ssh keys for branchable and github repo hooks -- TODO: upgrade to newer git-annex-shell for notification ] From 0b9879942fa5d00b8329fc3ebc14563de3d9fbf8 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 14:45:18 -0400 Subject: [PATCH 42/70] propellor spin --- Propellor/Property/SiteSpecific/JoeySites.hs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Propellor/Property/SiteSpecific/JoeySites.hs b/Propellor/Property/SiteSpecific/JoeySites.hs index 4b98fe0..0594fe5 100644 --- a/Propellor/Property/SiteSpecific/JoeySites.hs +++ b/Propellor/Property/SiteSpecific/JoeySites.hs @@ -47,7 +47,7 @@ gitServer hosts = propertyList "git.kitenet.net setup" , File.hasPrivContentExposed "/etc/kgb-bot/kgb-client.conf" , toProp $ Git.daemonRunning "/srv/git" , "/etc/gitweb.conf" `File.containsLines` - [ "$projectroot = 'srv/git';" + [ "$projectroot = '/srv/git';" , "@git_base_url_list = ('git://git.kitenet.net', 'http://git.kitenet.net/git', 'ssh://git.kitenet.net/srv/git');" , "# disable snapshot download; overloads server" , "$feature{'snapshot'}{'default'} = [];" @@ -75,6 +75,7 @@ gitapacheconf hn = , " " , " Options Indexes ExecCGI FollowSymlinks" , " AllowOverride None" + , " AddHandler cgi-script .cgi" , " DirectoryIndex index.cgi" , " " , "" From 576acfed33abfae2065354431100701713e83a23 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 14:58:56 -0400 Subject: [PATCH 43/70] propellor spin --- Propellor/Property/SiteSpecific/JoeySites.hs | 1 - 1 file changed, 1 deletion(-) diff --git a/Propellor/Property/SiteSpecific/JoeySites.hs b/Propellor/Property/SiteSpecific/JoeySites.hs index 0594fe5..9192786 100644 --- a/Propellor/Property/SiteSpecific/JoeySites.hs +++ b/Propellor/Property/SiteSpecific/JoeySites.hs @@ -58,7 +58,6 @@ gitServer hosts = propertyList "git.kitenet.net setup" , website "git.kitenet.net" , website "git.joeyh.name" , toProp $ Apache.modEnabled "cgi" - -- ssh keys for branchable and github repo hooks -- TODO: upgrade to newer git-annex-shell for notification ] where From 95ac5163da904780ae166c2bf3a0addcb8d8870e Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 15:34:01 -0400 Subject: [PATCH 44/70] Properties can now be satisfied differently on different operating systems. --- Propellor/Attr.hs | 7 +++++++ Propellor/Message.hs | 4 ++-- Propellor/Property.hs | 8 ++++++++ Propellor/Types.hs | 28 ++-------------------------- Propellor/Types/Attr.hs | 7 ++++++- Propellor/Types/OS.hs | 19 +++++++++++++++++++ config-joey.hs | 12 +++++++----- debian/changelog | 2 ++ propellor.cabal | 1 + 9 files changed, 54 insertions(+), 34 deletions(-) create mode 100644 Propellor/Types/OS.hs diff --git a/Propellor/Attr.hs b/Propellor/Attr.hs index 67ea8b8..9a9d844 100644 --- a/Propellor/Attr.hs +++ b/Propellor/Attr.hs @@ -21,6 +21,13 @@ hostname name = pureAttrProperty ("hostname " ++ name) $ getHostName :: Propellor HostName getHostName = asks _hostname +os :: System -> AttrProperty +os system = pureAttrProperty ("OS " ++ show system) $ + \d -> d { _os = Just system } + +getOS :: Propellor (Maybe System) +getOS = asks _os + cname :: Domain -> AttrProperty cname domain = pureAttrProperty ("cname " ++ domain) (addCName domain) diff --git a/Propellor/Message.hs b/Propellor/Message.hs index 2e63061..780471c 100644 --- a/Propellor/Message.hs +++ b/Propellor/Message.hs @@ -29,7 +29,7 @@ actionMessage desc a = do return r warningMessage :: MonadIO m => String -> m () -warningMessage s = liftIO $ colorLine Vivid Red $ "** warning: " ++ s +warningMessage s = liftIO $ colorLine Vivid Magenta $ "** warning: " ++ s colorLine :: ColorIntensity -> Color -> String -> IO () colorLine intensity color msg = do @@ -43,7 +43,7 @@ colorLine intensity color msg = do errorMessage :: String -> IO a errorMessage s = do - warningMessage s + liftIO $ colorLine Vivid Red $ "** error: " ++ s error "Cannot continue!" -- | Causes a debug message to be displayed when PROPELLOR_DEBUG=1 diff --git a/Propellor/Property.hs b/Propellor/Property.hs index 3e41fbc..95d17c0 100644 --- a/Propellor/Property.hs +++ b/Propellor/Property.hs @@ -10,6 +10,7 @@ import "mtl" Control.Monad.Reader import Propellor.Types import Propellor.Types.Attr +import Propellor.Attr import Propellor.Engine import Utility.Monad import System.FilePath @@ -91,6 +92,13 @@ check c property = Property (propertyDesc property) $ ifM (liftIO c) , return NoChange ) +-- | Makes a property that is satisfied differently depending on the host's +-- operating system. +-- +-- Note that the operating system may not be declared for some hosts. +withOS :: Desc -> (Maybe System -> Propellor Result) -> Property +withOS desc a = Property desc $ a =<< getOS + boolProperty :: Desc -> IO Bool -> Property boolProperty desc a = Property desc $ ifM (liftIO a) ( return MadeChange diff --git a/Propellor/Types.hs b/Propellor/Types.hs index b8f8f16..5f575da 100644 --- a/Propellor/Types.hs +++ b/Propellor/Types.hs @@ -6,8 +6,6 @@ module Propellor.Types ( Host(..) , Attr , HostName - , UserName - , GroupName , Propellor(..) , Property(..) , RevertableProperty(..) @@ -19,16 +17,12 @@ module Propellor.Types , requires , Desc , Result(..) - , System(..) - , Distribution(..) - , DebianSuite(..) - , Release - , Architecture , ActionResult(..) , CmdLine(..) , PrivDataField(..) , GpgKeyId , SshKeyType(..) + , module Propellor.Types.OS ) where import Data.Monoid @@ -38,12 +32,10 @@ import "mtl" Control.Monad.Reader import "MonadCatchIO-transformers" Control.Monad.CatchIO import Propellor.Types.Attr +import Propellor.Types.OS data Host = Host [Property] (Attr -> Attr) -type UserName = String -type GroupName = String - -- | Propellor's monad provides read-only access to attributes of the -- system. newtype Propellor p = Propellor { runWithAttr :: ReaderT Attr IO p } @@ -119,22 +111,6 @@ instance Monoid Result where mappend _ MadeChange = MadeChange mappend NoChange NoChange = NoChange --- | High level descritption of a operating system. -data System = System Distribution Architecture - deriving (Show) - -data Distribution - = Debian DebianSuite - | Ubuntu Release - deriving (Show) - -data DebianSuite = Experimental | Unstable | Testing | Stable | DebianRelease Release - deriving (Show, Eq) - -type Release = String - -type Architecture = String - -- | Results of actions, with color. class ActionResult a where getActionResult :: a -> (String, ColorIntensity, Color) diff --git a/Propellor/Types/Attr.hs b/Propellor/Types/Attr.hs index cdbe9ca..1ff5814 100644 --- a/Propellor/Types/Attr.hs +++ b/Propellor/Types/Attr.hs @@ -1,11 +1,14 @@ module Propellor.Types.Attr where +import Propellor.Types.OS + import qualified Data.Set as S -- | The attributes of a host. For example, its hostname. data Attr = Attr { _hostname :: HostName , _cnames :: S.Set Domain + , _os :: Maybe System , _sshPubKey :: Maybe String , _dockerImage :: Maybe String @@ -16,6 +19,7 @@ instance Eq Attr where x == y = and [ _hostname x == _hostname y , _cnames x == _cnames y + , _os x == _os y , _sshPubKey x == _sshPubKey y , _dockerImage x == _dockerImage y @@ -27,13 +31,14 @@ instance Show Attr where show a = unlines [ "hostname " ++ _hostname a , "cnames " ++ show (_cnames a) + , "OS " ++ show (_os a) , "sshPubKey " ++ show (_sshPubKey a) , "docker image " ++ show (_dockerImage a) , "docker run params " ++ show (map (\mk -> mk "") (_dockerRunParams a)) ] newAttr :: HostName -> Attr -newAttr hn = Attr hn S.empty Nothing Nothing [] +newAttr hn = Attr hn S.empty Nothing Nothing Nothing [] type HostName = String type Domain = String diff --git a/Propellor/Types/OS.hs b/Propellor/Types/OS.hs new file mode 100644 index 0000000..5b0e376 --- /dev/null +++ b/Propellor/Types/OS.hs @@ -0,0 +1,19 @@ +module Propellor.Types.OS where + +type UserName = String +type GroupName = String + +-- | High level descritption of a operating system. +data System = System Distribution Architecture + deriving (Show, Eq) + +data Distribution + = Debian DebianSuite + | Ubuntu Release + deriving (Show, Eq) + +data DebianSuite = Experimental | Unstable | Testing | Stable | DebianRelease Release + deriving (Show, Eq) + +type Release = String +type Architecture = String diff --git a/config-joey.hs b/config-joey.hs index aba648d..ed214e8 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -29,7 +29,7 @@ hosts = & Apt.buildDep ["git-annex"] `period` Daily -- Nothing super-important lives here. - , standardSystem "clam.kitenet.net" Unstable + , standardSystem "clam.kitenet.net" Unstable "amd64" & cleanCloudAtCost & Apt.unattendedUpgrades & Network.ipv6to4 @@ -53,7 +53,7 @@ hosts = & Apt.installed ["git-annex", "mtr", "screen"] -- Orca is the main git-annex build box. - , standardSystem "orca.kitenet.net" Unstable + , standardSystem "orca.kitenet.net" Unstable "amd64" & Hostname.sane & Apt.unattendedUpgrades & Docker.configured @@ -65,7 +65,7 @@ hosts = & Apt.buildDep ["git-annex"] `period` Daily -- Important stuff that needs not too much memory or CPU. - , standardSystem "diatom.kitenet.net" Stable + , standardSystem "diatom.kitenet.net" Stable "amd64" & Hostname.sane & Ssh.hostKey SshDsa & Ssh.hostKey SshRsa @@ -142,8 +142,9 @@ gitAnnexBuilder arch buildminute = Docker.container (arch ++ "-git-annex-builder & Apt.unattendedUpgrades -- This is my standard system setup. -standardSystem :: HostName -> DebianSuite -> Host -standardSystem hn suite = host hn +standardSystem :: HostName -> DebianSuite -> Architecture -> Host +standardSystem hn suite arch = host hn + & os (System (Debian suite) arch) & Apt.stdSourcesList suite `onChange` Apt.upgrade & Apt.installed ["etckeeper"] & Apt.installed ["ssh"] @@ -166,6 +167,7 @@ standardSystem hn suite = host hn -- This is my standard container setup, featuring automatic upgrades. standardContainer :: Docker.ContainerName -> DebianSuite -> Architecture -> Host standardContainer name suite arch = Docker.container name (image system) + & os (System (Debian suite) arch) & Apt.stdSourcesList suite & Apt.unattendedUpgrades where diff --git a/debian/changelog b/debian/changelog index b3cc554..4c18df2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -4,6 +4,8 @@ propellor (0.3.1) UNRELEASED; urgency=medium * Support for provisioning hosts with ssh and gpg keys. * Obnam support. * Apache support. + * Properties can now be satisfied differently on different operating + systems. -- Joey Hess Fri, 11 Apr 2014 15:00:11 -0400 diff --git a/propellor.cabal b/propellor.cabal index a7b7fbc..1d62538 100644 --- a/propellor.cabal +++ b/propellor.cabal @@ -97,6 +97,7 @@ Library Propellor.Engine Propellor.Exception Propellor.Types + Propellor.Types.OS Other-Modules: Propellor.Types.Attr Propellor.CmdLine From f806a55649a5d06b479123e35fef4d592e6efe0d Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 15:37:43 -0400 Subject: [PATCH 45/70] propellor spin --- Propellor/Property/SiteSpecific/JoeySites.hs | 23 +++++++++++--------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/Propellor/Property/SiteSpecific/JoeySites.hs b/Propellor/Property/SiteSpecific/JoeySites.hs index 9192786..3115d4b 100644 --- a/Propellor/Property/SiteSpecific/JoeySites.hs +++ b/Propellor/Property/SiteSpecific/JoeySites.hs @@ -104,14 +104,17 @@ gitapacheconf hn = , "" ] --- Note: needs debian unstable for new kgb kgbServer :: Property -kgbServer = propertyList "kgb.kitenet.net setup" - [ Apt.serviceInstalledRunning "kgb-bot" - , File.hasPrivContent "/etc/kgb-bot/kgb.conf" - `onChange` Service.restarted "kgb-bot" - , "/etc/default/kgb-bot" `File.containsLine` "BOT_ENABLED=1" - `describe` "kgb bot enabled" - `onChange` Service.running "kgb-bot" - ] - +kgbServer = withOS desc $ \o -> case o of + (Just (System (Debian Unstable) _)) -> + ensureProperty $ propertyList desc + [ Apt.serviceInstalledRunning "kgb-bot" + , File.hasPrivContent "/etc/kgb-bot/kgb.conf" + `onChange` Service.restarted "kgb-bot" + , "/etc/default/kgb-bot" `File.containsLine` "BOT_ENABLED=1" + `describe` "kgb bot enabled" + `onChange` Service.running "kgb-bot" + ] + _ -> error "kgb server needs Debian unstable (for kgb-bot 1.31+)" + where + desc = "kgb.kitenet.net setup" From 2c1397c5b09f2bbc8339c9763c60fcca601bc212 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 15:54:25 -0400 Subject: [PATCH 46/70] Standard apt configuration for stable now includes backports. --- Propellor/Attr.hs | 2 +- Propellor/Property/Apt.hs | 25 ++++++++++++++++++++----- Propellor/Property/OpenId.hs | 2 +- debian/changelog | 1 + 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/Propellor/Attr.hs b/Propellor/Attr.hs index 9a9d844..94376b0 100644 --- a/Propellor/Attr.hs +++ b/Propellor/Attr.hs @@ -22,7 +22,7 @@ getHostName :: Propellor HostName getHostName = asks _hostname os :: System -> AttrProperty -os system = pureAttrProperty ("OS " ++ show system) $ +os system = pureAttrProperty ("Operating " ++ show system) $ \d -> d { _os = Just system } getOS :: Propellor (Maybe System) diff --git a/Propellor/Property/Apt.hs b/Propellor/Property/Apt.hs index 4da13a2..b7c281c 100644 --- a/Propellor/Property/Apt.hs +++ b/Propellor/Property/Apt.hs @@ -24,9 +24,12 @@ showSuite Unstable = "unstable" showSuite Experimental = "experimental" showSuite (DebianRelease r) = r -debLine :: DebianSuite -> Url -> [Section] -> Line +backportSuite :: DebianSuite -> String +backportSuite suite = showSuite suite ++ "-backports" + +debLine :: String -> Url -> [Section] -> Line debLine suite mirror sections = unwords $ - ["deb", mirror, showSuite suite] ++ sections + ["deb", mirror, suite] ++ sections srcLine :: Line -> Line srcLine l = case words l of @@ -37,9 +40,12 @@ stdSections :: [Section] stdSections = ["main", "contrib", "non-free"] binandsrc :: String -> DebianSuite -> [Line] -binandsrc url suite = [l, srcLine l] +binandsrc url suite + | suite == Stable = [l, srcLine l, bl, srcLine bl] + | otherwise = [l, srcLine l] where - l = debLine suite url stdSections + l = debLine (showSuite suite) url stdSections + bl = debLine (backportSuite suite) url stdSections debCdn :: DebianSuite -> [Line] debCdn = binandsrc "http://cdn.debian.net/debian" @@ -62,7 +68,7 @@ securityUpdates suite -- kernel.org. stdSourcesList :: DebianSuite -> Property stdSourcesList suite = setSourcesList - (debCdn suite ++ kernelOrg suite ++ securityUpdates suite) + (concatMap (\gen -> gen suite) [debCdn, kernelOrg, securityUpdates]) `describe` ("standard sources.list for " ++ show suite) setSourcesList :: [Line] -> Property @@ -96,6 +102,15 @@ installed' params ps = robustly $ check (isInstallable ps) go where go = runApt $ params ++ ["install"] ++ ps +installedBackport :: [Package] -> Property +installedBackport ps = withOS desc $ \o -> case o of + (Just (System (Debian suite) _)) -> + ensureProperty $ installed' ["-t", backportSuite suite, "-y"] ps + Nothing -> error "cannot install backports; os not declared" + _ -> error $ "backports not supported on " ++ show o + where + desc = (unwords $ "apt installed backport":ps) + -- | Minimal install of package, without recommends. installedMin :: [Package] -> Property installedMin = installed' ["--no-install-recommends", "-y"] diff --git a/Propellor/Property/OpenId.hs b/Propellor/Property/OpenId.hs index 4c56217..051d642 100644 --- a/Propellor/Property/OpenId.hs +++ b/Propellor/Property/OpenId.hs @@ -12,7 +12,7 @@ providerFor users baseurl = propertyList desc $ [ Apt.serviceInstalledRunning "apache2" , Apt.installed ["simpleid"] `onChange` Service.restarted "apache2" - , File.fileProperty desc + , File.fileProperty (desc ++ " configured") (map setbaseurl) "/etc/simpleid/config.inc" ] ++ map identfile users where diff --git a/debian/changelog b/debian/changelog index 4c18df2..18436b2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -6,6 +6,7 @@ propellor (0.3.1) UNRELEASED; urgency=medium * Apache support. * Properties can now be satisfied differently on different operating systems. + * Standard apt configuration for stable now includes backports. -- Joey Hess Fri, 11 Apr 2014 15:00:11 -0400 From f8e350e4c88c0b535e5ceba33a5ab226a9acd33a Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 16:06:23 -0400 Subject: [PATCH 47/70] propellor spin --- Propellor/Property/SiteSpecific/JoeySites.hs | 4 ++-- TODO | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Propellor/Property/SiteSpecific/JoeySites.hs b/Propellor/Property/SiteSpecific/JoeySites.hs index 3115d4b..635d99b 100644 --- a/Propellor/Property/SiteSpecific/JoeySites.hs +++ b/Propellor/Property/SiteSpecific/JoeySites.hs @@ -43,7 +43,8 @@ gitServer hosts = propertyList "git.kitenet.net setup" `requires` Ssh.knownHost hosts "usw-s002.rsync.net" "root" `requires` Ssh.authorizedKeys "family" `requires` User.accountFor "family" - , Apt.installed ["git", "git-annex", "rsync", "kgb-client-git", "gitweb"] + , Apt.installed ["git", "rsync", "kgb-client-git", "gitweb"] + , Apt.installedBackport ["git-annex"] , File.hasPrivContentExposed "/etc/kgb-bot/kgb-client.conf" , toProp $ Git.daemonRunning "/srv/git" , "/etc/gitweb.conf" `File.containsLines` @@ -58,7 +59,6 @@ gitServer hosts = propertyList "git.kitenet.net setup" , website "git.kitenet.net" , website "git.joeyh.name" , toProp $ Apache.modEnabled "cgi" - -- TODO: upgrade to newer git-annex-shell for notification ] where website hn = toProp $ Apache.siteEnabled hn (gitapacheconf hn) diff --git a/TODO b/TODO index a203169..93dcf0d 100644 --- a/TODO +++ b/TODO @@ -2,9 +2,6 @@ run it once for the whole. For example, may want to restart apache, but only once despite many config changes being made to satisfy properties. onChange is a poor substitute. -* Currently only Debian and derivatives are supported by most Properties. - This could be improved by making the Distribution of the system part - of its HostAttr. * Display of docker container properties is a bit wonky. It always says they are unchanged even when they changed and triggered a reprovision. @@ -18,3 +15,7 @@ * There is no way for a property of a docker container to require some property be met outside the container. For example, some servers need ntp installed for a good date source. +* Attributes can only be set in the top level property list for a Host. + If an attribute is set inside a propertyList, it won't propigate out. + Fix this. Probably the fix involves combining AttrProperty into Property. + Then propertyList can gather the attributes from its list. From feeec9d3819d39cbb0c0ece3b5c6628881f2d5a1 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 16:38:58 -0400 Subject: [PATCH 48/70] propellor spin --- Propellor/Property/SiteSpecific/JoeySites.hs | 94 ++++++++++++++++---- config-joey.hs | 14 ++- 2 files changed, 92 insertions(+), 16 deletions(-) diff --git a/Propellor/Property/SiteSpecific/JoeySites.hs b/Propellor/Property/SiteSpecific/JoeySites.hs index 635d99b..e111946 100644 --- a/Propellor/Property/SiteSpecific/JoeySites.hs +++ b/Propellor/Property/SiteSpecific/JoeySites.hs @@ -13,6 +13,7 @@ import qualified Propellor.Property.Service as Service import qualified Propellor.Property.User as User import qualified Propellor.Property.Obnam as Obnam import qualified Propellor.Property.Apache as Apache +import Utility.SafeCommand oldUseNetShellBox :: Property oldUseNetShellBox = check (not <$> Apt.isInstalled "oldusenet") $ @@ -30,6 +31,21 @@ oldUseNetShellBox = check (not <$> Apt.isInstalled "oldusenet") $ ] `describe` "olduse.net built" ] +kgbServer :: Property +kgbServer = withOS desc $ \o -> case o of + (Just (System (Debian Unstable) _)) -> + ensureProperty $ propertyList desc + [ Apt.serviceInstalledRunning "kgb-bot" + , File.hasPrivContent "/etc/kgb-bot/kgb.conf" + `onChange` Service.restarted "kgb-bot" + , "/etc/default/kgb-bot" `File.containsLine` "BOT_ENABLED=1" + `describe` "kgb bot enabled" + `onChange` Service.running "kgb-bot" + ] + _ -> error "kgb server needs Debian unstable (for kgb-bot 1.31+)" + where + desc = "kgb.kitenet.net setup" + -- git.kitenet.net and git.joeyh.name gitServer :: [Host] -> Property gitServer hosts = propertyList "git.kitenet.net setup" @@ -63,6 +79,69 @@ gitServer hosts = propertyList "git.kitenet.net setup" where website hn = toProp $ Apache.siteEnabled hn (gitapacheconf hn) +type AnnexUUID = String + +-- | A website, with files coming from a git-annex repository. +annexWebSite :: Git.RepoUrl -> HostName -> AnnexUUID -> [(String, Git.RepoUrl)] -> Property +annexWebSite origin hn uuid remotes = Git.cloned "joey" origin dir Nothing + `onChange` setup + `onChange` toProp (Apache.siteEnabled hn $ annexwebsiteconf hn) + where + dir = "/srv/web/" ++ hn + setup = userScriptProperty "joey" $ + [ "cd " ++ shellEscape dir + , "git config annex.uuid " ++ shellEscape uuid + ] ++ map addremote remotes ++ + [ "git annex get" + ] + addremote (name, url) = "git remote add " ++ shellEscape name ++ " " ++ shellEscape url + +annexwebsiteconf :: HostName -> Apache.ConfigFile +annexwebsiteconf hn = stanza 80 False ++ stanza 443 True + where + stanza :: Int -> Bool -> Apache.ConfigFile + stanza port withssl = catMaybes + [ Just $ "" + , Just $ " ServerAdmin joey@kitenet.net" + , Just $ "" + , Just $ " ServerName "++hn++":"++show port + , Just $ " ServerAlias www."++hn + , Just $ "" + , ssl $ " SSLEngine on" + , ssl $ " SSLCertificateFile /etc/ssl/certs/web.pem" + , ssl $ " SSLCertificateKeyFile /etc/ssl/private/web.pem" + , ssl $ " SSLCertificateChainFile /etc/ssl/certs/startssl.pem" + , Just $ "" + , Just $ " DocumentRoot /srv/web/"++hn + , Just $ " " + , Just $ " Options FollowSymLinks" + , Just $ " AllowOverride None" + , Just $ " " + , Just $ " " + , Just $ " Options Indexes FollowSymLinks ExecCGI" + , Just $ " AllowOverride None" + , Just $ " Order allow,deny" + , Just $ " allow from all" + , Just $ " " + , Just $ "" + , Just $ " ErrorLog /var/log/apache2/error.log" + , Just $ " LogLevel warn" + , Just $ " CustomLog /var/log/apache2/access.log combined" + , Just $ " ServerSignature On" + , Just $ " " + , Just $ " " + , Just $ " Options Indexes MultiViews" + , Just $ " AllowOverride None" + , Just $ " Order allow,deny" + , Just $ " Allow from all" + , Just $ " " + , Just $ "" + ] + where + ssl l + | withssl = Just l + | otherwise = Nothing + gitapacheconf :: HostName -> Apache.ConfigFile gitapacheconf hn = [ "" @@ -103,18 +182,3 @@ gitapacheconf hn = , " " , "" ] - -kgbServer :: Property -kgbServer = withOS desc $ \o -> case o of - (Just (System (Debian Unstable) _)) -> - ensureProperty $ propertyList desc - [ Apt.serviceInstalledRunning "kgb-bot" - , File.hasPrivContent "/etc/kgb-bot/kgb.conf" - `onChange` Service.restarted "kgb-bot" - , "/etc/default/kgb-bot" `File.containsLine` "BOT_ENABLED=1" - `describe` "kgb bot enabled" - `onChange` Service.running "kgb-bot" - ] - _ -> error "kgb server needs Debian unstable (for kgb-bot 1.31+)" - where - desc = "kgb.kitenet.net setup" diff --git a/config-joey.hs b/config-joey.hs index ed214e8..f148403 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -74,14 +74,26 @@ hosts = & Apt.serviceInstalledRunning "ntp" & Dns.zones myDnsSecondary & Apt.serviceInstalledRunning "apache2" + & File.ownerGroup "/srv" "joey" "joey" & cname "git.kitenet.net" & cname "git.joeyh.name" & JoeySites.gitServer hosts & cname "downloads.kitenet.net" + & JoeySites.annexWebSite "/srv/git/download.git" + "downloads.kitenet.net" + "840760dc-08f0-11e2-8c61-576b7e66acfd" + [("turtle", "ssh://turtle.kitenet.net/~/lib/downloads/")] & Apt.buildDep ["git-annex"] `period` Daily - -- downloads.kitenet.net setup (including ssh key to turtle) + + & cname "tmp.kitenet.net" + & JoeySites.annexWebSite "/srv/git/joey/tmp.git" + "tmp.kitenet.net" + "274ce1ca-1226-11e2-bcbd-eb57078e31b1" + [] + + & Apt.installed ["ntop"] -- I don't run this system, so only relevant property is its -- public key. From 32ffe1797271a269708ca06060bbe18f1b6f880a Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 16:49:49 -0400 Subject: [PATCH 49/70] propellor spin --- Propellor/Property/SiteSpecific/JoeySites.hs | 2 ++ config-joey.hs | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Propellor/Property/SiteSpecific/JoeySites.hs b/Propellor/Property/SiteSpecific/JoeySites.hs index e111946..ba77eac 100644 --- a/Propellor/Property/SiteSpecific/JoeySites.hs +++ b/Propellor/Property/SiteSpecific/JoeySites.hs @@ -70,6 +70,8 @@ gitServer hosts = propertyList "git.kitenet.net setup" , "$feature{'snapshot'}{'default'} = [];" ] `describe` "gitweb configured" + -- Repos push on to github. + , Ssh.knownHost hosts "github.com" "joey" -- I keep the website used for gitweb checked into git.. , Git.cloned "root" "/srv/git/joey/git.kitenet.net.git" "/srv/web/git.kitenet.net" Nothing , website "git.kitenet.net" diff --git a/config-joey.hs b/config-joey.hs index f148403..f0f2f29 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -95,10 +95,11 @@ hosts = & Apt.installed ["ntop"] - -- I don't run this system, so only relevant property is its - -- public key. + -- Systems I don't run, but do want to track their public keys. , host "usw-s002.rsync.net" & sshPubKey "ssh-dss AAAAB3NzaC1kc3MAAAEBAI6ZsoW8a+Zl6NqUf9a4xXSMcV1akJHDEKKBzlI2YZo9gb9YoCf5p9oby8THUSgfh4kse7LJeY7Nb64NR6Y/X7I2/QzbE1HGGl5mMwB6LeUcJ74T3TQAlNEZkGt/MOIVLolJHk049hC09zLpkUDtX8K0t1yaCirC9SxDGLTCLEhvU9+vVdVrdQlKZ9wpLUNbdAzvbra+O/IVvExxDZ9WCHrnfNA8ddVZIGEWMqsoNgiuCxiXpi8qL+noghsSQNFTXwo7W2Vp9zj1JkCt3GtSz5IzEpARQaXEAWNEM0n1nJ686YUOhou64iRM8bPC1lp3QXvvZNgj3m+QHhIempx+de8AAAAVAKB5vUDaZOg14gRn7Bp81ja/ik+RAAABACPH/bPbW912x1NxNiikzGR6clLh+bLpIp8Qie3J7DwOr8oC1QOKjNDK+UgQ7mDQEgr4nGjNKSvpDi4c1QCw4sbLqQgx1y2VhT0SmUPHf5NQFldRQyR/jcevSSwOBxszz3aq9AwHiv9OWaO3XY18suXPouiuPTpIcZwc2BLDNHFnDURQeGEtmgqj6gZLIkTY0iw7q9Tj5FOyl4AkvEJC5B4CSzaWgey93Wqn1Imt7KI8+H9lApMKziVL1q+K7xAuNkGmx5YOSNlE6rKAPtsIPHZGxR7dch0GURv2jhh0NQYvBRn3ukCjuIO5gx56HLgilq59/o50zZ4NcT7iASF76TcAAAEAC6YxX7rrs8pp13W4YGiJHwFvIO1yXLGOdqu66JM0plO4J1ItV1AQcazOXLiliny3p2/W+wXZZKd5HIRt52YafCA8YNyMk/sF7JcTR4d4z9CfKaAxh0UpzKiAk+0j/Wu3iPoTOsyt7N0j1+dIyrFodY2sKKuBMT4TQ0yqQpbC+IDQv2i1IlZAPneYGfd5MIGygs2QMfaMQ1jWAKJvEO0vstZ7GB6nDAcg4in3ZiBHtomx3PL5w+zg48S4Ed69BiFXLZ1f6MnjpUOP75pD4MP6toS0rgK9b93xCrEQLgm4oD/7TCHHBo2xR7wwcsN2OddtwWsEM2QgOkt/jdCAoVCqwQ==" + , host "github.com" + & sshPubKey "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==" --' __|II| ,. ---- __|II|II|__ ( \_,/\ From a9151250f2cb8d37f45506d96e8370ddf2103dce Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 16:53:33 -0400 Subject: [PATCH 50/70] propellor spin --- config-joey.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config-joey.hs b/config-joey.hs index f0f2f29..67296bc 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -74,7 +74,7 @@ hosts = & Apt.serviceInstalledRunning "ntp" & Dns.zones myDnsSecondary & Apt.serviceInstalledRunning "apache2" - & File.ownerGroup "/srv" "joey" "joey" + & File.ownerGroup "/srv/web" "joey" "joey" & cname "git.kitenet.net" & cname "git.joeyh.name" From 414b0dffec57d259d761965b5b5da3bfb57b1a80 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 16:54:24 -0400 Subject: [PATCH 51/70] propellor spin --- Propellor/CmdLine.hs | 2 +- config-joey.hs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Propellor/CmdLine.hs b/Propellor/CmdLine.hs index b58179f..5be91c4 100644 --- a/Propellor/CmdLine.hs +++ b/Propellor/CmdLine.hs @@ -174,7 +174,7 @@ spin hn = do cacheparams <- toCommand <$> sshCachingParams hn go cacheparams url =<< gpgDecrypt (privDataFile hn) where - go cacheparams url privdata = withBothHandles createProcessSuccess (proc "ssh" $ cacheparams ++ ["-t", user, bootstrapcmd]) $ \(toh, fromh) -> do + go cacheparams url privdata = withBothHandles createProcessSuccess (proc "ssh" $ cacheparams ++ [user, bootstrapcmd]) $ \(toh, fromh) -> do let finish = do senddata toh (privDataFile hn) privDataMarker privdata hClose toh diff --git a/config-joey.hs b/config-joey.hs index 67296bc..ab878fb 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -81,7 +81,7 @@ hosts = & JoeySites.gitServer hosts & cname "downloads.kitenet.net" - & JoeySites.annexWebSite "/srv/git/download.git" + & JoeySites.annexWebSite "/srv/git/downloads.git" "downloads.kitenet.net" "840760dc-08f0-11e2-8c61-576b7e66acfd" [("turtle", "ssh://turtle.kitenet.net/~/lib/downloads/")] From a79e33944d14a3ee050ce6663e3813e0c2f52b26 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 17:03:21 -0400 Subject: [PATCH 52/70] propellor spin --- Propellor/Property/SiteSpecific/JoeySites.hs | 9 ++++++--- config-joey.hs | 11 +++++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/Propellor/Property/SiteSpecific/JoeySites.hs b/Propellor/Property/SiteSpecific/JoeySites.hs index ba77eac..6b14959 100644 --- a/Propellor/Property/SiteSpecific/JoeySites.hs +++ b/Propellor/Property/SiteSpecific/JoeySites.hs @@ -84,13 +84,16 @@ gitServer hosts = propertyList "git.kitenet.net setup" type AnnexUUID = String -- | A website, with files coming from a git-annex repository. -annexWebSite :: Git.RepoUrl -> HostName -> AnnexUUID -> [(String, Git.RepoUrl)] -> Property -annexWebSite origin hn uuid remotes = Git.cloned "joey" origin dir Nothing +annexWebSite :: [Host] -> Git.RepoUrl -> HostName -> AnnexUUID -> [(String, Git.RepoUrl)] -> Property +annexWebSite hosts origin hn uuid remotes = Git.cloned "joey" origin dir Nothing `onChange` setup `onChange` toProp (Apache.siteEnabled hn $ annexwebsiteconf hn) where dir = "/srv/web/" ++ hn - setup = userScriptProperty "joey" $ + setup = userScriptProperty "joey" setupscript + `requires` Ssh.keyImported SshRsa "joey" + `requires` Ssh.knownHost hosts "turtle.kitenet.net" "joey" + setupscript = [ "cd " ++ shellEscape dir , "git config annex.uuid " ++ shellEscape uuid ] ++ map addremote remotes ++ diff --git a/config-joey.hs b/config-joey.hs index ab878fb..055c1a6 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -81,21 +81,24 @@ hosts = & JoeySites.gitServer hosts & cname "downloads.kitenet.net" - & JoeySites.annexWebSite "/srv/git/downloads.git" + & JoeySites.annexWebSite hosts "/srv/git/downloads.git" "downloads.kitenet.net" "840760dc-08f0-11e2-8c61-576b7e66acfd" [("turtle", "ssh://turtle.kitenet.net/~/lib/downloads/")] & Apt.buildDep ["git-annex"] `period` Daily & cname "tmp.kitenet.net" - & JoeySites.annexWebSite "/srv/git/joey/tmp.git" + & JoeySites.annexWebSite hosts "/srv/git/joey/tmp.git" "tmp.kitenet.net" - "274ce1ca-1226-11e2-bcbd-eb57078e31b1" + "26fd6e38-1226-11e2-a75f-ff007033bdba" [] & Apt.installed ["ntop"] - -- Systems I don't run, but do want to track their public keys. + -- Systems I don't manage with propellor, + -- but do want to track their public keys. + , host "turtle.kitenet.net" + & sshPubKey "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAokMXQiX/NZjA1UbhMdgAscnS5dsmy+Q7bWrQ6tsTZ/o+6N/T5cbjoBHOdpypXJI3y/PiJTDJaQtXIhLa8gFg/EvxMnMz/KG9skADW1361JmfCc4BxicQIO2IOOe6eilPr+YsnOwiHwL0vpUnuty39cppuMWVD25GzxXlS6KQsLCvXLzxLLuNnGC43UAM0q4UwQxDtAZEK1dH2o3HMWhgMP2qEQupc24dbhpO3ecxh2C9678a3oGDuDuNf7mLp3s7ptj5qF3onitpJ82U5o7VajaHoygMaSRFeWxP2c13eM57j3bLdLwxVXFhePcKXARu1iuFTLS5uUf3hN6MkQcOGw==" , host "usw-s002.rsync.net" & sshPubKey "ssh-dss AAAAB3NzaC1kc3MAAAEBAI6ZsoW8a+Zl6NqUf9a4xXSMcV1akJHDEKKBzlI2YZo9gb9YoCf5p9oby8THUSgfh4kse7LJeY7Nb64NR6Y/X7I2/QzbE1HGGl5mMwB6LeUcJ74T3TQAlNEZkGt/MOIVLolJHk049hC09zLpkUDtX8K0t1yaCirC9SxDGLTCLEhvU9+vVdVrdQlKZ9wpLUNbdAzvbra+O/IVvExxDZ9WCHrnfNA8ddVZIGEWMqsoNgiuCxiXpi8qL+noghsSQNFTXwo7W2Vp9zj1JkCt3GtSz5IzEpARQaXEAWNEM0n1nJ686YUOhou64iRM8bPC1lp3QXvvZNgj3m+QHhIempx+de8AAAAVAKB5vUDaZOg14gRn7Bp81ja/ik+RAAABACPH/bPbW912x1NxNiikzGR6clLh+bLpIp8Qie3J7DwOr8oC1QOKjNDK+UgQ7mDQEgr4nGjNKSvpDi4c1QCw4sbLqQgx1y2VhT0SmUPHf5NQFldRQyR/jcevSSwOBxszz3aq9AwHiv9OWaO3XY18suXPouiuPTpIcZwc2BLDNHFnDURQeGEtmgqj6gZLIkTY0iw7q9Tj5FOyl4AkvEJC5B4CSzaWgey93Wqn1Imt7KI8+H9lApMKziVL1q+K7xAuNkGmx5YOSNlE6rKAPtsIPHZGxR7dch0GURv2jhh0NQYvBRn3ukCjuIO5gx56HLgilq59/o50zZ4NcT7iASF76TcAAAEAC6YxX7rrs8pp13W4YGiJHwFvIO1yXLGOdqu66JM0plO4J1ItV1AQcazOXLiliny3p2/W+wXZZKd5HIRt52YafCA8YNyMk/sF7JcTR4d4z9CfKaAxh0UpzKiAk+0j/Wu3iPoTOsyt7N0j1+dIyrFodY2sKKuBMT4TQ0yqQpbC+IDQv2i1IlZAPneYGfd5MIGygs2QMfaMQ1jWAKJvEO0vstZ7GB6nDAcg4in3ZiBHtomx3PL5w+zg48S4Ed69BiFXLZ1f6MnjpUOP75pD4MP6toS0rgK9b93xCrEQLgm4oD/7TCHHBo2xR7wwcsN2OddtwWsEM2QgOkt/jdCAoVCqwQ==" , host "github.com" From a3ece3f6b9562864c2dca8dc3d506e481b0f3b10 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 17:04:14 -0400 Subject: [PATCH 53/70] propellor spin --- privdata/diatom.kitenet.net.gpg | 388 +++++++++++++++++--------------- 1 file changed, 207 insertions(+), 181 deletions(-) diff --git a/privdata/diatom.kitenet.net.gpg b/privdata/diatom.kitenet.net.gpg index 8172333..98ca296 100644 --- a/privdata/diatom.kitenet.net.gpg +++ b/privdata/diatom.kitenet.net.gpg @@ -1,185 +1,211 @@ -----BEGIN PGP MESSAGE----- Version: GnuPG v1 -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 -=B2HG +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 +FzJJqTwUEp3yurIjSWC8pJJIL30xW9Z3h8pYwg== +=/PZR -----END PGP MESSAGE----- From d3789e7e3e1edd8c9fe79e094dfc525e1023e639 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 17:05:00 -0400 Subject: [PATCH 54/70] propellor spin From e958460475afdff1a1f2ecfb406370e444cb95f9 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 17:07:12 -0400 Subject: [PATCH 55/70] propellor spin --- privdata/diatom.kitenet.net.gpg | 420 ++++++++++++++++---------------- 1 file changed, 213 insertions(+), 207 deletions(-) diff --git a/privdata/diatom.kitenet.net.gpg b/privdata/diatom.kitenet.net.gpg index 98ca296..07f8810 100644 --- a/privdata/diatom.kitenet.net.gpg +++ b/privdata/diatom.kitenet.net.gpg @@ -1,211 +1,217 @@ -----BEGIN PGP MESSAGE----- Version: GnuPG v1 -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 -FzJJqTwUEp3yurIjSWC8pJJIL30xW9Z3h8pYwg== -=/PZR +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 +J5Yw1PEVyA== +=+zgv -----END PGP MESSAGE----- From 56dd4ff4d8c77293e8e703f91fc8ac5ef96d55e9 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 17:16:31 -0400 Subject: [PATCH 56/70] propellor spin --- Propellor/Property/Ssh.hs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Propellor/Property/Ssh.hs b/Propellor/Property/Ssh.hs index 6bfe126..b13a12b 100644 --- a/Propellor/Property/Ssh.hs +++ b/Propellor/Property/Ssh.hs @@ -107,8 +107,12 @@ keyImported keytype user = combineProperties desc f <- liftIO $ keyfile ext ifM (liftIO $ doesFileExist f) ( noChange - , withPrivData p $ \key -> makeChange $ - writer f key + , ensureProperty $ combineProperties desc + [ Property desc $ + withPrivData p $ \key -> makeChange $ + writer f key + , File.ownerGroup f user user + ] ) keyfile ext = do home <- homeDirectory <$> getUserEntryForName user @@ -130,6 +134,7 @@ knownHost hosts hn user = Property desc $ ensureProperty $ combineProperties desc [ File.dirExists (takeDirectory f) , f `File.containsLine` (hn ++ " " ++ k) + , File.ownerGroup f user user ] go _ = do warningMessage $ "no configred sshPubKey for " ++ hn @@ -138,8 +143,9 @@ knownHost hosts hn user = Property desc $ -- | Makes a user have authorized_keys from the PrivData authorizedKeys :: UserName -> Property authorizedKeys user = Property (user ++ " has authorized_keys") $ - withPrivData (SshAuthorizedKeys user) $ \v -> liftIO $ do + withPrivData (SshAuthorizedKeys user) $ \v -> do f <- liftIO $ dotFile "authorized_keys" user - createDirectoryIfMissing True (takeDirectory f) - writeFileProtected f v - return NoChange + liftIO $ do + createDirectoryIfMissing True (takeDirectory f) + writeFileProtected f v + ensureProperty $ File.ownerGroup f user user From 38cd54a7ee853f13036a02205e1655eac6e7b43a Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 17:17:09 -0400 Subject: [PATCH 57/70] propellor spin From 90370dc57576ec6d4701acd4b5672eeba269a386 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 17:50:44 -0400 Subject: [PATCH 58/70] stable-backports can't be used :( --- Propellor/Property/Apache.hs | 4 ++++ Propellor/Property/Apt.hs | 15 ++++++++------- Propellor/Types/OS.hs | 7 +++++++ config-joey.hs | 6 ++++++ 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/Propellor/Property/Apache.hs b/Propellor/Property/Apache.hs index 81daf9e..eab8786 100644 --- a/Propellor/Property/Apache.hs +++ b/Propellor/Property/Apache.hs @@ -11,10 +11,12 @@ siteEnabled :: HostName -> ConfigFile -> RevertableProperty siteEnabled hn cf = RevertableProperty enable disable where enable = cmdProperty "a2ensite" ["--quiet", hn] + `describe` ("apache site enabled " ++ hn) `requires` siteAvailable hn cf `requires` installed `onChange` reloaded disable = File.notPresent (siteCfg hn) + `describe` ("apache site disabled " ++ hn) `onChange` cmdProperty "a2dissite" ["--quiet", hn] `requires` installed `onChange` reloaded @@ -29,9 +31,11 @@ modEnabled :: String -> RevertableProperty modEnabled modname = RevertableProperty enable disable where enable = cmdProperty "a2enmod" ["--quiet", modname] + `describe` ("apache module enabled " ++ modname) `requires` installed `onChange` reloaded disable = cmdProperty "a2dismod" ["--quiet", modname] + `describe` ("apache module disabled " ++ modname) `requires` installed `onChange` reloaded diff --git a/Propellor/Property/Apt.hs b/Propellor/Property/Apt.hs index b7c281c..5c095d6 100644 --- a/Propellor/Property/Apt.hs +++ b/Propellor/Property/Apt.hs @@ -24,8 +24,8 @@ showSuite Unstable = "unstable" showSuite Experimental = "experimental" showSuite (DebianRelease r) = r -backportSuite :: DebianSuite -> String -backportSuite suite = showSuite suite ++ "-backports" +backportSuite :: String +backportSuite = showSuite stableRelease ++ "-backports" debLine :: String -> Url -> [Section] -> Line debLine suite mirror sections = unwords $ @@ -41,11 +41,11 @@ stdSections = ["main", "contrib", "non-free"] binandsrc :: String -> DebianSuite -> [Line] binandsrc url suite - | suite == Stable = [l, srcLine l, bl, srcLine bl] + | isStable suite = [l, srcLine l, bl, srcLine bl] | otherwise = [l, srcLine l] where l = debLine (showSuite suite) url stdSections - bl = debLine (backportSuite suite) url stdSections + bl = debLine backportSuite url stdSections debCdn :: DebianSuite -> [Line] debCdn = binandsrc "http://cdn.debian.net/debian" @@ -56,7 +56,7 @@ kernelOrg = binandsrc "http://mirrors.kernel.org/debian" -- | Only available for Stable and Testing securityUpdates :: DebianSuite -> [Line] securityUpdates suite - | suite == Stable || suite == Testing = + | isStable suite || suite == Testing = let l = "deb http://security.debian.org/ " ++ showSuite suite ++ "/updates " ++ unwords stdSections in [l, srcLine l] | otherwise = [] @@ -104,9 +104,10 @@ installed' params ps = robustly $ check (isInstallable ps) go installedBackport :: [Package] -> Property installedBackport ps = withOS desc $ \o -> case o of - (Just (System (Debian suite) _)) -> - ensureProperty $ installed' ["-t", backportSuite suite, "-y"] ps Nothing -> error "cannot install backports; os not declared" + (Just (System (Debian suite) _)) + | isStable suite -> + ensureProperty $ installed' ["-t", backportSuite, "-y"] ps _ -> error $ "backports not supported on " ++ show o where desc = (unwords $ "apt installed backport":ps) diff --git a/Propellor/Types/OS.hs b/Propellor/Types/OS.hs index 5b0e376..0635b27 100644 --- a/Propellor/Types/OS.hs +++ b/Propellor/Types/OS.hs @@ -15,5 +15,12 @@ data Distribution data DebianSuite = Experimental | Unstable | Testing | Stable | DebianRelease Release deriving (Show, Eq) +-- | The release that currently corresponds to stable. +stableRelease :: DebianSuite +stableRelease = DebianRelease "wheezy" + +isStable :: DebianSuite -> Bool +isStable s = s == Stable || s == stableRelease + type Release = String type Architecture = String diff --git a/config-joey.hs b/config-joey.hs index 055c1a6..031b493 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -86,6 +86,12 @@ hosts = "840760dc-08f0-11e2-8c61-576b7e66acfd" [("turtle", "ssh://turtle.kitenet.net/~/lib/downloads/")] & Apt.buildDep ["git-annex"] `period` Daily + -- rsync server for git-annex autobuilders + & Apt.installed ["rsync"] + & hasPrivContent "/etc/rsyncd.conf" + & hasPrivContent "/etc/rsyncd.secrets" + & "/etc/default/rsync" `File.containsLine` "" + `describe` "rsync server enabled" & cname "tmp.kitenet.net" & JoeySites.annexWebSite hosts "/srv/git/joey/tmp.git" From 61f192bac1a7f43fbb4fc99513a36b657e86c8b4 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 18:21:37 -0400 Subject: [PATCH 59/70] propellor spin --- config-joey.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config-joey.hs b/config-joey.hs index 031b493..d277fc2 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -88,8 +88,8 @@ hosts = & Apt.buildDep ["git-annex"] `period` Daily -- rsync server for git-annex autobuilders & Apt.installed ["rsync"] - & hasPrivContent "/etc/rsyncd.conf" - & hasPrivContent "/etc/rsyncd.secrets" + & File.hasPrivContent "/etc/rsyncd.conf" + & File.hasPrivContent "/etc/rsyncd.secrets" & "/etc/default/rsync" `File.containsLine` "" `describe` "rsync server enabled" From f392bd6390e35e7ff6991399449b0699b8cc2245 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 18:23:37 -0400 Subject: [PATCH 60/70] propellor spin From b345271f0b231ac5dd10143298d2d5cf655686be Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 18:29:57 -0400 Subject: [PATCH 61/70] propellor spin --- Propellor/Property/Apt.hs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Propellor/Property/Apt.hs b/Propellor/Property/Apt.hs index 5c095d6..f45bc2e 100644 --- a/Propellor/Property/Apt.hs +++ b/Propellor/Property/Apt.hs @@ -107,7 +107,8 @@ installedBackport ps = withOS desc $ \o -> case o of Nothing -> error "cannot install backports; os not declared" (Just (System (Debian suite) _)) | isStable suite -> - ensureProperty $ installed' ["-t", backportSuite, "-y"] ps + ensureProperty $ runApt $ + ["install", "-t", backportSuite, "-y"] ++ ps _ -> error $ "backports not supported on " ++ show o where desc = (unwords $ "apt installed backport":ps) From b143b5af13272f162e3144a52d8dc97bea824648 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 18:41:02 -0400 Subject: [PATCH 62/70] propellor spin --- Propellor/Property/SiteSpecific/JoeySites.hs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Propellor/Property/SiteSpecific/JoeySites.hs b/Propellor/Property/SiteSpecific/JoeySites.hs index 6b14959..f7c432c 100644 --- a/Propellor/Property/SiteSpecific/JoeySites.hs +++ b/Propellor/Property/SiteSpecific/JoeySites.hs @@ -87,7 +87,11 @@ type AnnexUUID = String annexWebSite :: [Host] -> Git.RepoUrl -> HostName -> AnnexUUID -> [(String, Git.RepoUrl)] -> Property annexWebSite hosts origin hn uuid remotes = Git.cloned "joey" origin dir Nothing `onChange` setup - `onChange` toProp (Apache.siteEnabled hn $ annexwebsiteconf hn) + `onChange` setupapache + `requires` File.hasPrivContent "/etc/ssl/certs/web.pem" + `requires` File.hasPrivContent "/etc/ssl/private/web.pem" + `requires` File.hasPrivContent "/etc/ssl/certs/startssl.pem" + `requires` toProp (Apache.modEnabled "ssl") where dir = "/srv/web/" ++ hn setup = userScriptProperty "joey" setupscript @@ -100,6 +104,7 @@ annexWebSite hosts origin hn uuid remotes = Git.cloned "joey" origin dir Nothing [ "git annex get" ] addremote (name, url) = "git remote add " ++ shellEscape name ++ " " ++ shellEscape url + setupapache = toProp (Apache.siteEnabled hn $ annexwebsiteconf hn) annexwebsiteconf :: HostName -> Apache.ConfigFile annexwebsiteconf hn = stanza 80 False ++ stanza 443 True From c05a89a55cae3df46d9afd2063a4978368207176 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 18:42:58 -0400 Subject: [PATCH 63/70] propellor spin --- privdata/diatom.kitenet.net.gpg | 547 +++++++++++++++++++------------- 1 file changed, 334 insertions(+), 213 deletions(-) diff --git a/privdata/diatom.kitenet.net.gpg b/privdata/diatom.kitenet.net.gpg index 07f8810..0bae164 100644 --- a/privdata/diatom.kitenet.net.gpg +++ b/privdata/diatom.kitenet.net.gpg @@ -1,217 +1,338 @@ -----BEGIN PGP MESSAGE----- Version: GnuPG v1 -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 -J5Yw1PEVyA== -=+zgv +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 +am+2hbBVcbc4qnKW+Q== +=P04/ -----END PGP MESSAGE----- From 45dee149e57446daa29c3cd7542f645291b1c271 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 18:47:27 -0400 Subject: [PATCH 64/70] propellor spin --- privdata/diatom.kitenet.net.gpg | 672 ++++++++++++++++---------------- 1 file changed, 338 insertions(+), 334 deletions(-) diff --git a/privdata/diatom.kitenet.net.gpg b/privdata/diatom.kitenet.net.gpg index 0bae164..d32b0e6 100644 --- a/privdata/diatom.kitenet.net.gpg +++ b/privdata/diatom.kitenet.net.gpg @@ -1,338 +1,342 @@ -----BEGIN PGP MESSAGE----- Version: GnuPG v1 -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 -am+2hbBVcbc4qnKW+Q== -=P04/ +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 +=P0Hl -----END PGP MESSAGE----- From 774f6600ebf6fc2650206200f74d39f65751a9ff Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 18:50:16 -0400 Subject: [PATCH 65/70] propellor spin --- config-joey.hs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config-joey.hs b/config-joey.hs index d277fc2..ca1c220 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -17,6 +17,7 @@ import qualified Propellor.Property.Dns as Dns import qualified Propellor.Property.OpenId as OpenId import qualified Propellor.Property.Docker as Docker import qualified Propellor.Property.Git as Git +import qualified Propellor.Property.Service as Service import qualified Propellor.Property.SiteSpecific.GitHome as GitHome import qualified Propellor.Property.SiteSpecific.GitAnnexBuilder as GitAnnexBuilder import qualified Propellor.Property.SiteSpecific.JoeySites as JoeySites @@ -90,8 +91,9 @@ hosts = & Apt.installed ["rsync"] & File.hasPrivContent "/etc/rsyncd.conf" & File.hasPrivContent "/etc/rsyncd.secrets" - & "/etc/default/rsync" `File.containsLine` "" + & "/etc/default/rsync" `File.containsLine` "RSYNC_ENABLE=true" `describe` "rsync server enabled" + `onChange` Service.running "rsync" & cname "tmp.kitenet.net" & JoeySites.annexWebSite hosts "/srv/git/joey/tmp.git" From fb1d65125b543b38151974e12a3ad3b672cc9aa6 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 20:22:35 -0400 Subject: [PATCH 66/70] propellor spin --- Propellor/Property/SiteSpecific/JoeySites.hs | 149 ++++++++----------- config-joey.hs | 6 + 2 files changed, 68 insertions(+), 87 deletions(-) diff --git a/Propellor/Property/SiteSpecific/JoeySites.hs b/Propellor/Property/SiteSpecific/JoeySites.hs index f7c432c..bd6e93f 100644 --- a/Propellor/Property/SiteSpecific/JoeySites.hs +++ b/Propellor/Property/SiteSpecific/JoeySites.hs @@ -79,7 +79,21 @@ gitServer hosts = propertyList "git.kitenet.net setup" , toProp $ Apache.modEnabled "cgi" ] where - website hn = toProp $ Apache.siteEnabled hn (gitapacheconf hn) + website hn = toProp $ Apache.siteEnabled hn $ apachecfg hn True + [ " DocumentRoot /srv/web/git.kitenet.net/" + , " " + , " Options Indexes ExecCGI FollowSymlinks" + , " AllowOverride None" + , " AddHandler cgi-script .cgi" + , " DirectoryIndex index.cgi" + , " " + , "" + , " ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/" + , " " + , " SetHandler cgi-script" + , " Options ExecCGI" + , " " + ] type AnnexUUID = String @@ -88,10 +102,6 @@ annexWebSite :: [Host] -> Git.RepoUrl -> HostName -> AnnexUUID -> [(String, Git. annexWebSite hosts origin hn uuid remotes = Git.cloned "joey" origin dir Nothing `onChange` setup `onChange` setupapache - `requires` File.hasPrivContent "/etc/ssl/certs/web.pem" - `requires` File.hasPrivContent "/etc/ssl/private/web.pem" - `requires` File.hasPrivContent "/etc/ssl/certs/startssl.pem" - `requires` toProp (Apache.modEnabled "ssl") where dir = "/srv/web/" ++ hn setup = userScriptProperty "joey" setupscript @@ -104,91 +114,56 @@ annexWebSite hosts origin hn uuid remotes = Git.cloned "joey" origin dir Nothing [ "git annex get" ] addremote (name, url) = "git remote add " ++ shellEscape name ++ " " ++ shellEscape url - setupapache = toProp (Apache.siteEnabled hn $ annexwebsiteconf hn) + setupapache = toProp $ Apache.siteEnabled hn $ apachecfg hn True $ + [ " ServerAlias www."++hn + , "" + , " DocumentRoot /srv/web/"++hn + , " " + , " Options FollowSymLinks" + , " AllowOverride None" + , " " + , " " + , " Options Indexes FollowSymLinks ExecCGI" + , " AllowOverride None" + , " Order allow,deny" + , " allow from all" + , " " + ] -annexwebsiteconf :: HostName -> Apache.ConfigFile -annexwebsiteconf hn = stanza 80 False ++ stanza 443 True +apachecfg :: HostName -> Bool -> Apache.ConfigFile -> Apache.ConfigFile +apachecfg hn withssl middle + | withssl = vhost False ++ vhost True + | otherwise = vhost False where - stanza :: Int -> Bool -> Apache.ConfigFile - stanza port withssl = catMaybes - [ Just $ "" - , Just $ " ServerAdmin joey@kitenet.net" - , Just $ "" - , Just $ " ServerName "++hn++":"++show port - , Just $ " ServerAlias www."++hn - , Just $ "" - , ssl $ " SSLEngine on" - , ssl $ " SSLCertificateFile /etc/ssl/certs/web.pem" - , ssl $ " SSLCertificateKeyFile /etc/ssl/private/web.pem" - , ssl $ " SSLCertificateChainFile /etc/ssl/certs/startssl.pem" - , Just $ "" - , Just $ " DocumentRoot /srv/web/"++hn - , Just $ " " - , Just $ " Options FollowSymLinks" - , Just $ " AllowOverride None" - , Just $ " " - , Just $ " " - , Just $ " Options Indexes FollowSymLinks ExecCGI" - , Just $ " AllowOverride None" - , Just $ " Order allow,deny" - , Just $ " allow from all" - , Just $ " " - , Just $ "" - , Just $ " ErrorLog /var/log/apache2/error.log" - , Just $ " LogLevel warn" - , Just $ " CustomLog /var/log/apache2/access.log combined" - , Just $ " ServerSignature On" - , Just $ " " - , Just $ " " - , Just $ " Options Indexes MultiViews" - , Just $ " AllowOverride None" - , Just $ " Order allow,deny" - , Just $ " Allow from all" - , Just $ " " - , Just $ "" + vhost ssl = + [ "" + , " ServerAdmin grue@joeyh.name" + , " ServerName "++hn++":"++show port + ] + ++ mainhttpscert ssl + ++ middle ++ + [ "" + , " ErrorLog /var/log/apache2/error.log" + , " LogLevel warn" + , " CustomLog /var/log/apache2/access.log combined" + , " ServerSignature On" + , " " + , " " + , " Options Indexes MultiViews" + , " AllowOverride None" + , " Order allow,deny" + , " Allow from all" + , " " + , "" ] where - ssl l - | withssl = Just l - | otherwise = Nothing + port = if ssl then 443 else 80 :: Int -gitapacheconf :: HostName -> Apache.ConfigFile -gitapacheconf hn = - [ "" - , " ServerAdmin joey@kitenet.net" - , "" - , " ServerName " ++ hn ++ ":80" - , "" - , " DocumentRoot /srv/web/git.kitenet.net/" - , " " - , " Options Indexes ExecCGI FollowSymlinks" - , " AllowOverride None" - , " AddHandler cgi-script .cgi" - , " DirectoryIndex index.cgi" - , " " - , "" - , " ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/" - , " " - , " SetHandler cgi-script" - , " Options ExecCGI" - , " " - , "" - , " ErrorLog /var/log/apache2/error.log" - , " LogLevel warn" - , " CustomLog /var/log/apache2/access.log combined" - , "" - , " # Possible values include: debug, info, notice, warn, error, crit," - , " # alert, emerg." - , " LogLevel warn" - , "" - , " CustomLog /var/log/apache2/access.log combined" - , " ServerSignature On" - , " " - , " " - , " Options Indexes MultiViews" - , " AllowOverride None" - , " Order allow,deny" - , " Allow from all" - , " " - , "" +mainhttpscert :: Bool -> Apache.ConfigFile +mainhttpscert False = [] +mainhttpscert True = + [ " SSLEngine on" + , " SSLCertificateFile /etc/ssl/certs/web.pem" + , " SSLCertificateKeyFile /etc/ssl/private/web.pem" + , " SSLCertificateChainFile /etc/ssl/certs/startssl.pem" ] diff --git a/config-joey.hs b/config-joey.hs index ca1c220..0809304 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -17,6 +17,7 @@ import qualified Propellor.Property.Dns as Dns import qualified Propellor.Property.OpenId as OpenId import qualified Propellor.Property.Docker as Docker import qualified Propellor.Property.Git as Git +import qualified Propellor.Property.Apache as Apache import qualified Propellor.Property.Service as Service import qualified Propellor.Property.SiteSpecific.GitHome as GitHome import qualified Propellor.Property.SiteSpecific.GitAnnexBuilder as GitAnnexBuilder @@ -74,7 +75,12 @@ hosts = & Apt.unattendedUpgrades & Apt.serviceInstalledRunning "ntp" & Dns.zones myDnsSecondary + & Apt.serviceInstalledRunning "apache2" + & File.hasPrivContent "/etc/ssl/certs/web.pem" + & File.hasPrivContent "/etc/ssl/private/web.pem" + & File.hasPrivContent "/etc/ssl/certs/startssl.pem" + & Apache.modEnabled "ssl" & File.ownerGroup "/srv/web" "joey" "joey" & cname "git.kitenet.net" From 56dd63916925627773cb2cf590f1c8191470dccc Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 21:04:34 -0400 Subject: [PATCH 67/70] propellor spin --- Propellor/Property/Apache.hs | 10 ++++++++++ Propellor/Property/SiteSpecific/JoeySites.hs | 10 ++++++---- config-joey.hs | 1 + 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Propellor/Property/Apache.hs b/Propellor/Property/Apache.hs index eab8786..f45ef9d 100644 --- a/Propellor/Property/Apache.hs +++ b/Propellor/Property/Apache.hs @@ -50,3 +50,13 @@ restarted = cmdProperty "service" ["apache2", "restart"] reloaded :: Property reloaded = Service.reloaded "apache2" + +-- | Configure apache to use SNI to differentiate between +-- https hosts. +multiSSL :: Property +multiSSL = "/etc/apache2/conf.d/ssl" `File.hasContent` + [ "NameVirtualHost *:443" + , "SSLStrictSNIVHostCheck off" + ] + `describe` "apache SNI enabled" + `onChange` reloaded diff --git a/Propellor/Property/SiteSpecific/JoeySites.hs b/Propellor/Property/SiteSpecific/JoeySites.hs index bd6e93f..73a8f71 100644 --- a/Propellor/Property/SiteSpecific/JoeySites.hs +++ b/Propellor/Property/SiteSpecific/JoeySites.hs @@ -65,7 +65,7 @@ gitServer hosts = propertyList "git.kitenet.net setup" , toProp $ Git.daemonRunning "/srv/git" , "/etc/gitweb.conf" `File.containsLines` [ "$projectroot = '/srv/git';" - , "@git_base_url_list = ('git://git.kitenet.net', 'http://git.kitenet.net/git', 'ssh://git.kitenet.net/srv/git');" + , "@git_base_url_list = ('git://git.kitenet.net', 'http://git.kitenet.net/git', 'https://git.kitenet.net/git', 'ssh://git.kitenet.net/srv/git');" , "# disable snapshot download; overloads server" , "$feature{'snapshot'}{'default'} = [];" ] @@ -99,9 +99,11 @@ type AnnexUUID = String -- | A website, with files coming from a git-annex repository. annexWebSite :: [Host] -> Git.RepoUrl -> HostName -> AnnexUUID -> [(String, Git.RepoUrl)] -> Property -annexWebSite hosts origin hn uuid remotes = Git.cloned "joey" origin dir Nothing - `onChange` setup - `onChange` setupapache +annexWebSite hosts origin hn uuid remotes = propertyList (hn ++" website using git-annex") + [ Git.cloned "joey" origin dir Nothing + `onChange` setup + , setupapache + ] where dir = "/srv/web/" ++ hn setup = userScriptProperty "joey" setupscript diff --git a/config-joey.hs b/config-joey.hs index 0809304..235a749 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -81,6 +81,7 @@ hosts = & File.hasPrivContent "/etc/ssl/private/web.pem" & File.hasPrivContent "/etc/ssl/certs/startssl.pem" & Apache.modEnabled "ssl" + & Apache.multiSSL & File.ownerGroup "/srv/web" "joey" "joey" & cname "git.kitenet.net" From ce799dc8725465ef0cf1126da75a9cf9ceeb9e82 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 21:33:07 -0400 Subject: [PATCH 68/70] propellor spin --- config-joey.hs | 1 - privdata/diatom.kitenet.net.gpg | 677 ++++++++++++++++---------------- 2 files changed, 339 insertions(+), 339 deletions(-) diff --git a/config-joey.hs b/config-joey.hs index 235a749..8f845d4 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -93,7 +93,6 @@ hosts = "downloads.kitenet.net" "840760dc-08f0-11e2-8c61-576b7e66acfd" [("turtle", "ssh://turtle.kitenet.net/~/lib/downloads/")] - & Apt.buildDep ["git-annex"] `period` Daily -- rsync server for git-annex autobuilders & Apt.installed ["rsync"] & File.hasPrivContent "/etc/rsyncd.conf" diff --git a/privdata/diatom.kitenet.net.gpg b/privdata/diatom.kitenet.net.gpg index d32b0e6..97100e7 100644 --- a/privdata/diatom.kitenet.net.gpg +++ b/privdata/diatom.kitenet.net.gpg @@ -1,342 +1,343 @@ -----BEGIN PGP MESSAGE----- Version: GnuPG v1 -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 -=P0Hl +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 +yVewygD9lbtfmV/+SUyvvLkzNZJ1+rot96g1a/4AzXcVOg22WrH/TOEkmUY9HqoC +lSlXW0rpCQxpsM7SbD2TN0eW5CFItIa9KlFIp55Pc8nf9gGaLIHowtexnJ50gmM9 +h6DvmYRGjHsKqXEWaxOSTs4+pkUiPL2pBSzwbeSCqfuGUd7QS0RTFLTB1OPoImei +sovdny+RbtmGamKvngkQrVnzNwCtnyqD3+W1twFtl5WI+2ytXLafdnJoHPhuS4qz +X4dJiIVfKgyjCNGIObz81RRnkqWoeWC4chHydA0wAL3LSlXABNJwDtKnguHpUvsU +3Ax2X0R9bzzFVjMWuQzWxvmHMVbstcZbMeViSABltG+PcpegSPNftq/2rk5Hmict +Er2nYeug/DCrPu+DM4SsUtrwXaLP/GBwNbzKxNcMgAIP9WxR+WPCxh/uqVrkf/+3 +M5d1D7eLOHzoQEi2pqbB5RJ5/J7gBeuewo9zErZfAEMrLLUPD+bdaBMdSZSRPd9n +eAvSzNMFHTm6EIWW1x9+mT/tWbT3zhkdrPRfOTWyt+ClDaR36LC+WtWbaqtCfhgy +4gtyx+yLvmc69mWd0f4CAvgSr3TZgjc3J8Sv4AYA1enm5Tz1qB6FivLxZhljGVO/ +5E/ia2XLZWgBAfF3e0bcyze6gEVex9bllKAl4uLqaMCnRKxjHVchoR9UWYfwj/4p +SPDOvBAw2xjlf48KckpxUdrV619tbCkUoZUv+Lir2Kgb2KMfpVJjCS848kx61OFB +e/thZr79zWMjO4toqxkpR6StG4O7oFB/HGdSbQfI5FH9+7EPtRXSG4SGRNFeZ1LM +9nnGCMCK85fUP5ZHfh8WJVPwexv4jC1UEw+tNon10aKssrMVgRdjRGKDL8mopux+ +jHPKT70kjcsau90FD52H8c0CKV7ab9Me6ZixphEcgsCmNiepwBd84WiBXoJ7KHON +h4ILCMNzVMiwb78T2lxr5kDhix7hEgxYxv/EmijWuLyEasrfMsH7ZVMiwn0w1KWU +ydp8Vh17F1YTlrYM/f9BeMyU58cXKC8UyFi7ewA1NlggEyc6Ph9DSVPxfLxE1ySp +ccU2Ggg/MijD04U+JV7TX6yQTx3tInCGAiVpOy/vgll4yVfUq+weRVKD/bDKvAJz +GJtrt/MZNK+UXukhs8JsIGlWyK6SkVmPEx5wzqm4Ma9QgmlNmt1YF3VPjp77ytkl +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 +=svT+ -----END PGP MESSAGE----- From 46c1ecf7bcb53a87dd77d46d9f29bfca618abc0c Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Apr 2014 21:34:19 -0400 Subject: [PATCH 69/70] propellor spin --- privdata/diatom.kitenet.net.gpg | 678 ++++++++++++++++---------------- 1 file changed, 339 insertions(+), 339 deletions(-) diff --git a/privdata/diatom.kitenet.net.gpg b/privdata/diatom.kitenet.net.gpg index 97100e7..99be63b 100644 --- a/privdata/diatom.kitenet.net.gpg +++ b/privdata/diatom.kitenet.net.gpg @@ -1,343 +1,343 @@ -----BEGIN PGP MESSAGE----- Version: GnuPG v1 -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 -yVewygD9lbtfmV/+SUyvvLkzNZJ1+rot96g1a/4AzXcVOg22WrH/TOEkmUY9HqoC -lSlXW0rpCQxpsM7SbD2TN0eW5CFItIa9KlFIp55Pc8nf9gGaLIHowtexnJ50gmM9 -h6DvmYRGjHsKqXEWaxOSTs4+pkUiPL2pBSzwbeSCqfuGUd7QS0RTFLTB1OPoImei -sovdny+RbtmGamKvngkQrVnzNwCtnyqD3+W1twFtl5WI+2ytXLafdnJoHPhuS4qz -X4dJiIVfKgyjCNGIObz81RRnkqWoeWC4chHydA0wAL3LSlXABNJwDtKnguHpUvsU -3Ax2X0R9bzzFVjMWuQzWxvmHMVbstcZbMeViSABltG+PcpegSPNftq/2rk5Hmict -Er2nYeug/DCrPu+DM4SsUtrwXaLP/GBwNbzKxNcMgAIP9WxR+WPCxh/uqVrkf/+3 -M5d1D7eLOHzoQEi2pqbB5RJ5/J7gBeuewo9zErZfAEMrLLUPD+bdaBMdSZSRPd9n -eAvSzNMFHTm6EIWW1x9+mT/tWbT3zhkdrPRfOTWyt+ClDaR36LC+WtWbaqtCfhgy -4gtyx+yLvmc69mWd0f4CAvgSr3TZgjc3J8Sv4AYA1enm5Tz1qB6FivLxZhljGVO/ -5E/ia2XLZWgBAfF3e0bcyze6gEVex9bllKAl4uLqaMCnRKxjHVchoR9UWYfwj/4p -SPDOvBAw2xjlf48KckpxUdrV619tbCkUoZUv+Lir2Kgb2KMfpVJjCS848kx61OFB -e/thZr79zWMjO4toqxkpR6StG4O7oFB/HGdSbQfI5FH9+7EPtRXSG4SGRNFeZ1LM -9nnGCMCK85fUP5ZHfh8WJVPwexv4jC1UEw+tNon10aKssrMVgRdjRGKDL8mopux+ -jHPKT70kjcsau90FD52H8c0CKV7ab9Me6ZixphEcgsCmNiepwBd84WiBXoJ7KHON -h4ILCMNzVMiwb78T2lxr5kDhix7hEgxYxv/EmijWuLyEasrfMsH7ZVMiwn0w1KWU -ydp8Vh17F1YTlrYM/f9BeMyU58cXKC8UyFi7ewA1NlggEyc6Ph9DSVPxfLxE1ySp -ccU2Ggg/MijD04U+JV7TX6yQTx3tInCGAiVpOy/vgll4yVfUq+weRVKD/bDKvAJz -GJtrt/MZNK+UXukhs8JsIGlWyK6SkVmPEx5wzqm4Ma9QgmlNmt1YF3VPjp77ytkl -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 -=svT+ +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 +=GAmO -----END PGP MESSAGE----- From 3a45bfa1a2ae855cac0653e92f897c3d151f038d Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 14 Apr 2014 02:24:55 -0400 Subject: [PATCH 70/70] ascii --- config-joey.hs | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/config-joey.hs b/config-joey.hs index 8f845d4..d64dd25 100644 --- a/config-joey.hs +++ b/config-joey.hs @@ -23,8 +23,13 @@ import qualified Propellor.Property.SiteSpecific.GitHome as GitHome import qualified Propellor.Property.SiteSpecific.GitAnnexBuilder as GitAnnexBuilder import qualified Propellor.Property.SiteSpecific.JoeySites as JoeySites -hosts :: [Host] -hosts = + + -- _ ______`| ,-.__ + {- Propellor -- / \___-=O`/|O`/__| (____.' + Deployed -} -- \ / | / ) _.-"-._ + -- `/-==__ _/__|/__=-| ( \_ +hosts :: [Host] -- * \ | | '--------' +hosts = -- (o) ` -- My laptop [ host "darkstar.kitenet.net" & Docker.configured @@ -238,4 +243,19 @@ myDnsSecondary = branchablemaster = ["66.228.46.55", "2600:3c03::f03c:91ff:fedf:c0e5"] main :: IO () -main = defaultMain hosts --, Docker.containerProperties container] +main = defaultMain hosts + + + + -- o + -- ___ o o + {-----\ / o \ ___o o + { \ __ \ / _ (X___>-- __o + _____________________{ ______\___ \__/ | \__/ \____ |X__> + < \___//|\\___/\ \____________ _ + \ ___/ | \___ # # \ (-) + \ O O O # | \ # >=) + \______________________________# # / #__________________/ (-} + + +