    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

    -- | Name of a board.
    type BoardName = String

    -- | Installs u-boot for Allwinner/sunxi platforms.
    --
    -- This includes writing it to the boot sector.
    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]