summaryrefslogtreecommitdiff
path: root/src/Propellor/Property/Reboot.hs
diff options
context:
space:
mode:
authorSean Whitton2016-06-12 11:59:03 +0900
committerSean Whitton2016-06-12 11:59:03 +0900
commit5a671a0841a8557e569f82748eb1eabb01b6c42e (patch)
tree67ee7bc22c0b86479d188a5f4c6e90c40c3e8864 /src/Propellor/Property/Reboot.hs
parent6c6a0c6d4bbff707203a66ec2be2ef70ccccb69c (diff)
toKernelNewerThan can give FailedChange
Diffstat (limited to 'src/Propellor/Property/Reboot.hs')
-rw-r--r--src/Propellor/Property/Reboot.hs21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/Propellor/Property/Reboot.hs b/src/Propellor/Property/Reboot.hs
index c3a1fb87..2d4319d9 100644
--- a/src/Propellor/Property/Reboot.hs
+++ b/src/Propellor/Property/Reboot.hs
@@ -14,6 +14,7 @@ import Data.Version
import Text.ParserCombinators.ReadP
type KernelVersion = String
+data KernelAvailable = Running | Installed | Unavailable
now :: Property Linux
now = tightenTargets $ cmdProperty "reboot" []
@@ -62,15 +63,23 @@ toDistroKernel = check (not <$> runningInstalledKernel) now
-- This is useful when upgrading to a new version of Debian where you need to
-- ensure that a new enough kernel is running before ensuring other properties.
toKernelNewerThan :: KernelVersion -> Property DebianLike
-toKernelNewerThan ver = property' ("reboot to kernel newer than " ++ ver) $ \w ->
- ifM (liftIO $ newerKernelAvailable (readVersion ver))
- (ensureProperty w now, noChange)
-
-newerKernelAvailable :: Version -> IO Bool
+toKernelNewerThan ver =
+ property' ("reboot to kernel newer than " ++ ver) $ \w -> do
+ available <- liftIO $ newerKernelAvailable (readVersion ver)
+ case available of
+ Running -> noChange
+ Installed -> ensureProperty w now
+ Unavailable -> return FailedChange
+
+newerKernelAvailable :: Version -> IO KernelAvailable
newerKernelAvailable wantV = do
runningV <- readVersion <$> runningKernelVersion
installedV <- maximum . map readVersion <$> installedKernelVersions
- return $ installedV >= wantV && runningV < wantV
+ if runningV >= wantV
+ then return Running
+ else if installedV >= wantV && runningV < wantV
+ then return Installed
+ else return Unavailable
runningInstalledKernel :: IO Bool
runningInstalledKernel = do