diff options
| author | Sean Whitton <spwhitton@spwhitton.name> | 2016-06-12 11:59:03 +0900 |
|---|---|---|
| committer | Sean Whitton <spwhitton@spwhitton.name> | 2016-06-12 11:59:03 +0900 |
| commit | 5a671a0841a8557e569f82748eb1eabb01b6c42e (patch) | |
| tree | 67ee7bc22c0b86479d188a5f4c6e90c40c3e8864 /src/Propellor | |
| parent | 6c6a0c6d4bbff707203a66ec2be2ef70ccccb69c (diff) | |
toKernelNewerThan can give FailedChange
Diffstat (limited to 'src/Propellor')
| -rw-r--r-- | src/Propellor/Property/Reboot.hs | 19 |
1 files changed, 14 insertions, 5 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) +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 Bool +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 |
