module Propellor.Property.Uboot where
import Propellor.Base
import Propellor.Types.Info
import Propellor.Types.Bootloader
import Propellor.Property.Chroot
import Propellor.Property.Mount
import qualified Propellor.Property.Apt as Apt
type BoardName = String
sunxi :: BoardName -> Property (HasInfo + DebianLike)
sunxi boardname = setInfoProperty (check (not <$> inChroot) go) info
`requires` Apt.installed ["u-boot", "u-boot-sunxi"]
where
go :: Property Linux
go = property' "u-boot installed" $ \w -> do
v <- liftIO $ getMountContaining "/boot"
case v of
Nothing -> error "unable to determine boot device"
Just dev -> ensureProperty w (dd dev "/")
dd :: FilePath -> FilePath -> Property Linux
dd dev prefix = tightenTargets $ cmdProperty "dd"
[ "conv=fsync,notrunc"
, "if=" ++ prefix ++ "/usr/lib/u-boot/"
++ boardname ++ "/u-boot-sunxi-with-spl.bin"
, "of=" ++ dev
, "bs=1024"
, "seek=8"
]
`assume` NoChange
info = toInfo [UbootInstalled dd]