summaryrefslogtreecommitdiff
path: root/src/Propellor/Property/Attic.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Propellor/Property/Attic.hs')
-rw-r--r--src/Propellor/Property/Attic.hs48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/Propellor/Property/Attic.hs b/src/Propellor/Property/Attic.hs
new file mode 100644
index 00000000..f2e0cbf1
--- /dev/null
+++ b/src/Propellor/Property/Attic.hs
@@ -0,0 +1,48 @@
+-- | Maintainer: FĂ©lix Sipma <felix+propellor@gueux.org>
+
+module Propellor.Property.Attic where
+
+import Propellor.Base
+import qualified Propellor.Property.Apt as Apt
+import qualified Propellor.Property.Cron as Cron
+import Data.List (intercalate)
+
+installed :: Property NoInfo
+installed = Apt.installed ["attic"]
+
+repoExists :: FilePath -> IO Bool
+repoExists repo = boolSystem "attic" [Param "list", File repo]
+
+backup :: [FilePath] -> FilePath -> Cron.Times -> [String] -> Property NoInfo
+backup dirs backupdir crontimes extraargs = propertyList (backupdir ++ " attic backup")
+ [ installed
+ , check (not <$> repoExists backupdir) $ cmdProperty "/usr/bin/attic" initargs
+ , Cron.niceJob ("attic_backup" ++ backupdir) crontimes (User "root") "/" backupcmd
+ ]
+ where
+ initargs =
+ [ "init"
+ , backupdir
+ ]
+ backupcmd = intercalate ";"
+ [ createCommand
+ , pruneCommand
+ ]
+ createCommand = unwords $
+ [ "/usr/bin/attic"
+ , "create"
+ , "--stats"
+ ]
+ ++ extraargs ++
+ [ backupdir ++ "::" ++ "$(date --iso-8601=ns --utc)"
+ , unwords dirs
+ ]
+ pruneCommand = unwords
+ [ "/usr/bin/attic"
+ , "prune"
+ , backupdir
+ , "--keep-daily=7"
+ , "--keep-weekly=4"
+ , "--keep-monthly=6"
+ , "--keep-yearly=1"
+ ]