diff options
| author | Joey Hess <joey@kitenet.net> | 2014-08-04 01:12:39 -0400 |
|---|---|---|
| committer | Joey Hess <joey@kitenet.net> | 2014-08-04 01:12:39 -0400 |
| commit | 81f370b9daa63c07236a4d88adcd407bd84267a9 (patch) | |
| tree | 749e52896eb0251364ecb904795f7018207150ec /src/Propellor/Property/Cron.hs | |
| parent | 8c51e3f8d1b1f2ed27124940062537c610bcd8ea (diff) | |
| parent | 9d2cc7774bb8ccf7c8663f28c55c489bc383e5ce (diff) | |
Merge branch 'joeyconfig'
Diffstat (limited to 'src/Propellor/Property/Cron.hs')
| -rw-r--r-- | src/Propellor/Property/Cron.hs | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/src/Propellor/Property/Cron.hs b/src/Propellor/Property/Cron.hs index 5b070eff..d55c3dbb 100644 --- a/src/Propellor/Property/Cron.hs +++ b/src/Propellor/Property/Cron.hs @@ -4,6 +4,7 @@ import Propellor import qualified Propellor.Property.File as File import qualified Propellor.Property.Apt as Apt import Utility.SafeCommand +import Utility.FileMode import Data.Char @@ -19,22 +20,33 @@ type CronTimes = String -- -- The cron job's output will only be emailed if it exits nonzero. job :: Desc -> CronTimes -> UserName -> FilePath -> String -> Property -job desc times user cddir command = cronjobfile `File.hasContent` - [ "# Generated by propellor" - , "" - , "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 - ++ " sh -c " ++ shellEscape cmdline +job desc times user cddir command = combineProperties ("cronned " ++ desc) + [ cronjobfile `File.hasContent` + [ "# Generated by propellor" + , "" + , "SHELL=/bin/sh" + , "PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" + , "" + , times ++ "\t" ++ user ++ "\tchronic " ++ shellEscape scriptfile + ] + -- 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" + , "flock -n " ++ shellEscape cronjobfile + ++ " sh -c " ++ shellEscape cmdline + ] + , scriptfile `File.mode` combineModes (readModes ++ executeModes) ] `requires` Apt.serviceInstalledRunning "cron" `requires` Apt.installed ["util-linux", "moreutils"] - `describe` ("cronned " ++ desc) where 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 | isAlphaNum c = c | otherwise = '_' @@ -42,7 +54,7 @@ job desc times user cddir command = cronjobfile `File.hasContent` -- | Installs a cron job, and runs it niced and ioniced. niceJob :: Desc -> CronTimes -> UserName -> FilePath -> String -> Property niceJob desc times user cddir command = job desc times user cddir - ("nice ionice -c 3 " ++ command) + ("nice ionice -c 3 sh -c " ++ shellEscape command) -- | Installs a cron job to run propellor. runPropellor :: CronTimes -> Property |
