summaryrefslogtreecommitdiff
path: root/src/Propellor/Property/DiskImage.hs
blob: 151082493a8e03d5b4dd535cd0c07da63005afd0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
{-# LANGUAGE FlexibleContexts #-}

module Propellor.Property.DiskImage (
	built,
	DiskImageConfig(..),
	DiskImageFinalization,
	grubBooted,
) where

import Propellor
import Propellor.Property.Chroot
import Utility.DataUnits
import Data.Monoid

-- | Creates a bootable disk image.
--
-- First the specified Chroot is set up, then a disk image is created,
-- large enough to fit the chroot, which is copied into it. Finally, the
-- DiskImageFinalization property is satisfied to make the disk image
-- bootable.
-- 
-- > let chroot d = Chroot.debootstrapped (System (Debian Unstable) "amd64") Debootstrap.DefaultConfig d
-- > 	& Apt.installed ["openssh-server"]
-- >	& Grub.installed Grub.PC
-- >	& ...
-- > in DiskImage.built mempty chroot DiskImage.grubBooted
built :: DiskImageConfig -> (FilePath -> Chroot) -> DiskImageFinalization -> RevertableProperty
built c = undefined

data DiskImageConfig = DiskImageConfig
	{ freeSpace :: ByteSize -- ^ A disk image is sized to fit the system installed in it. This adds some extra free space.
	}

instance Monoid DiskImageConfig where
	-- | Default value is 256 mb freeSpace.
	mempty = DiskImageConfig (1024 * 1024 * 256)
	mappend a b = a 
		{ freeSpace = freeSpace a + freeSpace b
		}

-- | This is a property that is run, chrooted into the disk image. It's
-- typically only used to set up the boot loader.
type DiskImageFinalization = Property NoInfo

-- | Makes grub be the boot loader of the disk image.
--
-- This does not cause grub to be installed. Use `Grub.installed` when
-- setting up the Chroot to do that.
grubBooted :: DiskImageFinalization
grubBooted = undefined