From 6e490dff6e82be1d0d77117bc2aa8cafb15a949e Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 18 Jul 2014 12:35:00 -0400 Subject: propellor spin --- src/Propellor/Property/Cron.hs | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) (limited to 'src/Propellor/Property') diff --git a/src/Propellor/Property/Cron.hs b/src/Propellor/Property/Cron.hs index d7138e3b..627599e6 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 ++ "\t" ++ 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" + , "chronic 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 = '_' -- cgit v1.2.3