propellor spin

This commit is contained in:
Joey Hess 2014-07-18 12:35:00 -04:00
parent b2e431bac9
commit 6e490dff6e
Failed to extract signature
1 changed files with 23 additions and 11 deletions

View File

@ -4,6 +4,7 @@ import Propellor
import qualified Propellor.Property.File as File import qualified Propellor.Property.File as File
import qualified Propellor.Property.Apt as Apt import qualified Propellor.Property.Apt as Apt
import Utility.SafeCommand import Utility.SafeCommand
import Utility.FileMode
import Data.Char import Data.Char
@ -19,22 +20,33 @@ type CronTimes = String
-- --
-- The cron job's output will only be emailed if it exits nonzero. -- The cron job's output will only be emailed if it exits nonzero.
job :: Desc -> CronTimes -> UserName -> FilePath -> String -> Property job :: Desc -> CronTimes -> UserName -> FilePath -> String -> Property
job desc times user cddir command = cronjobfile `File.hasContent` job desc times user cddir command = combineProperties ("cronned " ++ desc)
[ "# Generated by propellor" [ cronjobfile `File.hasContent`
, "" [ "# Generated by propellor"
, "SHELL=/bin/sh" , ""
, "PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" , "SHELL=/bin/sh"
, "" , "PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
, times ++ "\t" ++ user ++ "\t" , ""
++ "chronic flock -n " ++ shellEscape cronjobfile , times ++ "\t" ++ user ++ "\t" ++ shellEscape scriptfile
++ " sh -c " ++ shellEscape cmdline ]
-- Use a separate script because it makes the cron job name
-- prettier in emails, and also allows running the job manually.
, scriptfile `File.hasContent`
[ "#!/bin/sh"
, "# Generated by propellor"
, "set -e"
, "chronic flock -n " ++ shellEscape cronjobfile
++ " sh -c " ++ shellEscape cmdline
]
, scriptfile `File.mode` combineModes (readModes ++ executeModes)
] ]
`requires` Apt.serviceInstalledRunning "cron" `requires` Apt.serviceInstalledRunning "cron"
`requires` Apt.installed ["util-linux", "moreutils"] `requires` Apt.installed ["util-linux", "moreutils"]
`describe` ("cronned " ++ desc)
where where
cmdline = "cd " ++ cddir ++ " && ( " ++ command ++ " )" cmdline = "cd " ++ cddir ++ " && ( " ++ command ++ " )"
cronjobfile = "/etc/cron.d/" ++ map sanitize desc cronjobfile = "/etc/cron.d/" ++ name
scriptfile = "/usr/local/bin/" ++ name ++ "_cronjob"
name = map sanitize desc
sanitize c sanitize c
| isAlphaNum c = c | isAlphaNum c = c
| otherwise = '_' | otherwise = '_'