{-| Definition of 'VmScript' an artifact encapsulating several virtual machines disk images that can be mounted in an execution environment like "B9.LibVirtLXC". A 'VmScript' is embedded by in an 'B9.ArtifactGenerator.ArtifactGenerator'. -} module B9.Vm (VmScript (..) ,substVmScript) where import Data.Data import Data.Generics.Schemes import Data.Generics.Aliases import B9.ShellScript import B9.DiskImages import B9.ExecEnv import B9.Content.StringTemplate -- | Describe a virtual machine, i.e. a set up disk images to create and a shell -- script to put things together. data VmScript = VmScript CPUArch [SharedDirectory] Script | NoVmScript deriving (Read, Show, Typeable, Data, Eq) substVmScript :: [(String,String)] -> VmScript -> VmScript substVmScript env = everywhere gsubst where gsubst :: Data a => a -> a gsubst = mkT substMountPoint `extT` substSharedDir `extT` substScript substMountPoint NotMounted = NotMounted substMountPoint (MountPoint x) = MountPoint (sub x) substSharedDir (SharedDirectory fp mp) = SharedDirectory (sub fp) mp substSharedDir (SharedDirectoryRO fp mp) = SharedDirectoryRO (sub fp) mp substSharedDir s = s substScript (In fp s) = In (sub fp) s substScript (Run fp args) = Run (sub fp) (map sub args) substScript (As fp s) = As (sub fp) s substScript s = s sub = subst env