module Propellor.Property.Partition where
import Propellor.Base
import qualified Propellor.Property.Apt as Apt
data Fs = EXT2 | EXT3 | EXT4 | BTRFS | REISERFS | XFS | FAT | VFAT | NTFS | LinuxSwap
deriving (Show)
data Eep = YesReallyFormatPartition
formatted :: Eep -> Fs -> FilePath -> Property NoInfo
formatted = formatted' []
type MkfsOpts = [String]
formatted' :: MkfsOpts -> Eep -> Fs -> FilePath -> Property NoInfo
formatted' opts YesReallyFormatPartition fs dev =
cmdProperty cmd opts' `requires` Apt.installed [pkg]
where
(cmd, opts', pkg) = case fs of
EXT2 -> ("mkfs.ext2", q $ eff optsdev, "e2fsprogs")
EXT3 -> ("mkfs.ext3", q $ eff optsdev, "e2fsprogs")
EXT4 -> ("mkfs.ext4", q $ eff optsdev, "e2fsprogs")
BTRFS -> ("mkfs.btrfs", optsdev, "btrfs-tools")
REISERFS -> ("mkfs.reiserfs", q $ "-ff":optsdev, "reiserfsprogs")
XFS -> ("mkfs.xfs", "-f":q optsdev, "xfsprogs")
FAT -> ("mkfs.fat", optsdev, "dosfstools")
VFAT -> ("mkfs.vfat", optsdev, "dosfstools")
NTFS -> ("mkfs.ntfs", q $ eff optsdev, "ntfs-3g")
LinuxSwap -> ("mkswap", optsdev, "util-linux")
optsdev = opts++[dev]
eff l = "-F":l
q l = "-q":l
kpartx :: FilePath -> ([FilePath] -> Property NoInfo) -> Property NoInfo
kpartx diskimage mkprop = go `requires` Apt.installed ["kpartx"]
where
go = property (propertyDesc (mkprop [])) $ do
cleanup
s <- liftIO $ readProcess "kpartx" ["-avs", diskimage]
r <- ensureProperty (mkprop (devlist s))
cleanup
return r
devlist = mapMaybe (finddev . words) . lines
finddev ("add":"map":s:_) = Just ("/dev/mapper/" ++ s)
finddev _ = Nothing
cleanup = void $ liftIO $ boolSystem "kpartx" [Param "-d", File diskimage]