packages feed

swiss-army-knife-1.1.0.2: lib/Knives/ZfsCheck.hs

module Knives.ZfsCheck where

import CommandLine
import Data.List.Split (splitOn)
import Data.Char (isSpace)
import Data.List (isInfixOf)
import qualified Data.ByteString.Lazy as LBS
import qualified Data.ByteString.Lazy.Char8 as LBS8
import System.Process


knifeZfsCheck :: ZfsCheckOptions -> IO ()
knifeZfsCheck _ = do
  putStrLn $ "Check the version of archzfs with repo kernel version so you can determine if an upgrade is possible."

  let url_zfs = "https://raw.githubusercontent.com/openzfs/zfs/master/META"

  repo_version  <- readProcess "pacman" ["-Si", "linux"] "" -- | awk '/^Version/ { print $3 }'" ""
  archzfs_version <- readProcess "curl" ["-sSL", url_zfs] ""
  skernel <- readProcess "uname" ["-r"] ""
  sinstalled <- readProcess "pacman" ["-Q", "linux"] ""

  let repo    = splitAndTrim
                $ LBS8.unpack
                $ head [v | v <- LBS8.lines (LBS8.pack repo_version), (LBS8.pack "Version") `LBS.isPrefixOf` v]
      archzfs = splitAndTrim
                $ LBS8.unpack
                $ head [v | v <- LBS8.lines (LBS8.pack archzfs_version), (LBS8.pack "Linux-Maximum:") `LBS.isPrefixOf` v]
      running = trim skernel
      installed = unwords
                $ filter (not . ("linux" `isInfixOf`))
                $ words
                $ trim sinstalled

  putStrLn $ "\n      repo: " ++ repo
    ++ "\n       zfs: " ++ archzfs
    ++ "\n   running: " ++ running
    ++ "\n installed: " ++ installed

  where
    splitAndTrim line = trim $ last $ splitOn ":" line
    trim = f . f
      where f = reverse . dropWhile isSpace