diff options
| author | Sean Whitton <spwhitton@spwhitton.name> | 2016-06-12 11:18:49 +0900 |
|---|---|---|
| committer | Sean Whitton <spwhitton@spwhitton.name> | 2016-06-12 11:22:14 +0900 |
| commit | 9b88909410a86db981f7750cfd8ffeb98d3a8480 (patch) | |
| tree | 315453a10859d1afb853ccae5bc0c9f724b17b71 /src | |
| parent | 69a3ded2f0f6f968220f87cc54850a450e77a124 (diff) | |
rework newerKernelAvailable
Diffstat (limited to 'src')
| -rw-r--r-- | src/Propellor/Property/Reboot.hs | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/src/Propellor/Property/Reboot.hs b/src/Propellor/Property/Reboot.hs index 84cf3fc6..01a1add1 100644 --- a/src/Propellor/Property/Reboot.hs +++ b/src/Propellor/Property/Reboot.hs @@ -8,7 +8,6 @@ module Propellor.Property.Reboot ( import Propellor.Base import Data.List -import Data.String.Utils (split) import Data.Version type KernelVersion = String @@ -64,14 +63,11 @@ toKernelNewerThan ver = property' ("reboot to kernel newer than " ++ ver) $ \w - ifM (liftIO $ newerKernelAvailable (Prelude.read ver)) (ensureProperty w now, noChange) +-- TODO avoid Prelude.read newerKernelAvailable :: Version -> IO Bool newerKernelAvailable wantV = do runningV <- Prelude.read <$> runningKernelVersion - kernelImages <- installedKernelImages - when (null kernelImages) $ - error "failed to find any installed kernel images" - let installedV = maximum $ - Prelude.read . extractKernelVersion <$> kernelImages + installedV <- maximum . map Prelude.read <$> installedKernelVersions return $ installedV >= wantV && runningV < wantV runningInstalledKernel :: IO Bool @@ -94,14 +90,19 @@ installedKernelImages = concat <$> mapM kernelsIn ["/", "/boot/"] -- | File output looks something like this, we want to unambiguously -- match the running kernel version: -- Linux kernel x86 boot executable bzImage, version 3.16-3-amd64 (debian-kernel@lists.debian.org) #1 SMP Debian 3.1, RO-rootFS, swap_dev 0x2, Normal VGA -findVersion :: KernelVersion -> KernelVersion -> Bool +findVersion :: KernelVersion -> String -> Bool findVersion ver s = (" version " ++ ver ++ " ") `isInfixOf` s +installedKernelVersions :: IO [KernelVersion] +installedKernelVersions = do + kernelimages <- installedKernelImages + when (null kernelimages) $ + error "failed to find any installed kernel images" + imageLines <- lines <$> readProcess "file" ("-L" : kernelimages) + return $ extractKernelVersion <$> imageLines + kernelsIn :: FilePath -> IO [FilePath] kernelsIn d = filter ("vmlinu" `isInfixOf`) <$> dirContents d --- TODO this is way too crude extractKernelVersion :: String -> KernelVersion -extractKernelVersion s = - concat . filter (/= "") . reverse . drop 1 . reverse . drop 1 $ - split "-" s +extractKernelVersion = unwords . take 1 . dropWhile (/= "version") . words |
