diff options
| author | Sean Whitton <spwhitton@spwhitton.name> | 2016-06-12 12:49:38 +0900 |
|---|---|---|
| committer | Sean Whitton <spwhitton@spwhitton.name> | 2016-06-12 12:49:38 +0900 |
| commit | 9ff72b7a974e5cae031b96ec9c2cf2df604acc8f (patch) | |
| tree | 38dd3e2844be950c10fd0728331f88643c7dd3e7 /src/Propellor/Property/Reboot.hs | |
| parent | e782cdfc64f9c3491f5f81101bd4e5e3de761eb8 (diff) | |
handle errors when parsing kernel version strings
Diffstat (limited to 'src/Propellor/Property/Reboot.hs')
| -rw-r--r-- | src/Propellor/Property/Reboot.hs | 30 |
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) |
