packages feed

craft-0.0.0.1: src/Craft/Run/Nspawn.hs

module Craft.Run.Nspawn where

import           Control.Lens
import qualified Control.Monad.Trans as Trans
import qualified Data.ByteString     as BS
import qualified Data.Map.Strict     as Map
import           System.Process      hiding (readCreateProcessWithExitCode,
                                      readProcessWithExitCode)

import           Craft.Run.Internal
import           Craft.Types


runNspawn :: Path Abs Dir -> CraftRunner
runNspawn dir =
  CraftRunner
  { runExec =
      \ce command args ->
        let p = nspawnProc dir ce command args
        in execProc p
  , runExec_ =
      \ce command args ->
        let p = nspawnProc dir ce command args
        in execProc_ (showProc p) p
  , runFileRead =
      \fp -> do
        fp' <- stripDir $(mkAbsDir "/") fp
        Trans.lift . BS.readFile . fromAbsFile $ dir</>fp'
  , runFileWrite =
      \fp content -> do
        fp' <- stripDir $(mkAbsDir "/") fp
        Trans.lift (BS.writeFile (fromAbsFile (dir</>fp')) content)
  , runSourceFile =
      \src dest -> do
        dest' <- stripDir $(mkAbsDir "/") dest
        let p = (proc "/bin/cp" [src, fromAbsFile (dir</>dest')])
                { env           = Nothing
                , cwd           = Nothing
                , close_fds     = True
                , create_group  = True
                , delegate_ctlc = False
                }
        execProc_ (showProc p) p
  }


nspawnProc :: Path Abs Dir -> CraftEnv -> Command -> Args -> CreateProcess
nspawnProc dir ce cmd args =
  (proc "systemd-nspawn" ("-D":(fromAbsDir dir):"-q":cmd:args))
  { env           = Just $ Map.toList (ce ^. craftExecEnv)
  , cwd           = Just $ fromAbsDir (ce^.craftExecCWD)
  , close_fds     = True
  , create_group  = True
  , delegate_ctlc = False
  }