summaryrefslogtreecommitdiff
path: root/src/Propellor/Property/Reboot.hs
diff options
context:
space:
mode:
authorSean Whitton2016-06-12 12:49:38 +0900
committerSean Whitton2016-06-12 12:49:38 +0900
commit9ff72b7a974e5cae031b96ec9c2cf2df604acc8f (patch)
tree38dd3e2844be950c10fd0728331f88643c7dd3e7 /src/Propellor/Property/Reboot.hs
parente782cdfc64f9c3491f5f81101bd4e5e3de761eb8 (diff)
handle errors when parsing kernel version strings
Diffstat (limited to 'src/Propellor/Property/Reboot.hs')
-rw-r--r--src/Propellor/Property/Reboot.hs30
1 files changed, 18 insertions, 12 deletions
diff --git a/src/Propellor/Property/Reboot.hs b/src/Propellor/Property/Reboot.hs
index aa762629..f30621d4 100644
--- a/src/Propellor/Property/Reboot.hs
+++ b/src/Propellor/Property/Reboot.hs
@@ -1,5 +1,3 @@
-{-# LANGUAGE OverloadedStrings #-}
-
module Propellor.Property.Reboot (
now,
atEnd,
@@ -64,15 +62,16 @@ toDistroKernel = check (not <$> runningInstalledKernel) now
toKernelNewerThan :: KernelVersion -> Property DebianLike
toKernelNewerThan ver =
property' ("reboot to kernel newer than " ++ ver) $ \w -> do
- let wantV = readVersion ver
- runningV <- readVersion <$> liftIO runningKernelVersion
- installedV <- maximum . map readVersion <$>
- liftIO installedKernelVersions
+ wantV <- tryReadVersion ver
+ runningV <- tryReadVersion =<< liftIO runningKernelVersion
+ installedV <- maximum <$>
+ (mapM tryReadVersion =<< liftIO installedKernelVersions)
if runningV >= wantV then noChange
- else if installedV >= wantV && runningV < wantV
+ else if installedV >= wantV
then ensureProperty w now
- else error "newer kernel not installed"
- >> return FailedChange
+ else errorMessage ("kernel newer than "
+ ++ ver
+ ++ " not installed")
runningInstalledKernel :: IO Bool
runningInstalledKernel = do
@@ -112,6 +111,13 @@ extractKernelVersion :: String -> KernelVersion
extractKernelVersion =
unwords . take 1 . drop 1 . dropWhile (/= "version") . words
--- TODO properly handle error here
-readVersion :: String -> Version
-readVersion s = (fst . Prelude.last) $ readP_to_S parseVersion s
+-- adapted from Utility.PartialPrelude.readish
+readVersionMaybe :: KernelVersion -> Maybe Version
+readVersionMaybe ver = case readP_to_S parseVersion ver of
+ ((x,_):_) -> Just x
+ _ -> Nothing
+
+tryReadVersion :: KernelVersion -> Propellor Version
+tryReadVersion ver = case readVersionMaybe ver of
+ Just x -> return x
+ Nothing -> errorMessage ("couldn't parse version " ++ ver)