summaryrefslogtreecommitdiff
path: root/src/Propellor/Property/Cron.hs
diff options
context:
space:
mode:
authorJoey Hess2015-02-01 17:34:04 -0400
committerJoey Hess2015-02-01 17:34:04 -0400
commit8edc7ed3ae1062af745fbe21b0753df6ad83fe6a (patch)
treea5fdfe524441123971782f47902e3b84478267c1 /src/Propellor/Property/Cron.hs
parent30c8621f5c0c4833652ae04510f98706166efd7c (diff)
propellor spin
Diffstat (limited to 'src/Propellor/Property/Cron.hs')
-rw-r--r--src/Propellor/Property/Cron.hs35
1 files changed, 26 insertions, 9 deletions
diff --git a/src/Propellor/Property/Cron.hs b/src/Propellor/Property/Cron.hs
index 15cdd983..e75f5ee3 100644
--- a/src/Propellor/Property/Cron.hs
+++ b/src/Propellor/Property/Cron.hs
@@ -8,18 +8,26 @@ import Utility.FileMode
import Data.Char
-type CronTimes = String
+-- | When to run a cron job.
+--
+-- The Daily, Monthly, and Weekly options allow the cron job to be run
+-- by anacron, which is useful for non-servers.
+data Times
+ = Times String -- ^ formatted as in crontab(5)
+ | Daily
+ | Weekly
+ | Monthly
--- | Installs a cron job, run as a specified user, in a particular
--- directory. Note that the Desc must be unique, as it is used for the
--- cron.d/ filename.
+-- | Installs a cron job, that will run as a specified user in a particular
+-- directory. Note that the Desc must be unique, as it is used for the
+-- cron job filename.
--
-- Only one instance of the cron job is allowed to run at a time, no matter
-- how long it runs. This is accomplished using flock locking of the cron
-- job file.
--
-- The cron job's output will only be emailed if it exits nonzero.
-job :: Desc -> CronTimes -> UserName -> FilePath -> String -> Property NoInfo
+job :: Desc -> Times -> UserName -> FilePath -> String -> Property NoInfo
job desc times user cddir command = combineProperties ("cronned " ++ desc)
[ cronjobfile `File.hasContent`
[ "# Generated by propellor"
@@ -27,7 +35,11 @@ job desc times user cddir command = combineProperties ("cronned " ++ desc)
, "SHELL=/bin/sh"
, "PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
, ""
- , times ++ "\t" ++ user ++ "\tchronic " ++ shellEscape scriptfile
+ , case times of
+ Times t -> t ++ "\t" ++ user ++ "\tchronic " ++ shellEscape scriptfile
+ _ -> case user of
+ "root" -> "chronic " ++ shellEscape scriptfile
+ _ -> "chronic su " ++ user ++ " -c " ++ shellEscape scriptfile
]
-- Use a separate script because it makes the cron job name
-- prettier in emails, and also allows running the job manually.
@@ -44,7 +56,12 @@ job desc times user cddir command = combineProperties ("cronned " ++ desc)
`requires` Apt.installed ["util-linux", "moreutils"]
where
cmdline = "cd " ++ cddir ++ " && ( " ++ command ++ " )"
- cronjobfile = "/etc/cron.d/" ++ name
+ cronjobfile = "/etc" </> cronjobdir </> name
+ cronjobdir = case times of
+ Times _ -> "cron.d"
+ Daily -> "cron.daily"
+ Weekly -> "cron.weekly"
+ Monthly -> "cron.monthly"
scriptfile = "/usr/local/bin/" ++ name ++ "_cronjob"
name = map sanitize desc
sanitize c
@@ -52,10 +69,10 @@ job desc times user cddir command = combineProperties ("cronned " ++ desc)
| otherwise = '_'
-- | Installs a cron job, and runs it niced and ioniced.
-niceJob :: Desc -> CronTimes -> UserName -> FilePath -> String -> Property NoInfo
+niceJob :: Desc -> Times -> UserName -> FilePath -> String -> Property NoInfo
niceJob desc times user cddir command = job desc times user cddir
("nice ionice -c 3 sh -c " ++ shellEscape command)
-- | Installs a cron job to run propellor.
-runPropellor :: CronTimes -> Property NoInfo
+runPropellor :: Times -> Property NoInfo
runPropellor times = niceJob "propellor" times "root" localdir "./propellor"