handsy-0.0.1: src/System/Handsy/Remote.hs
{-# LANGUAGE OverloadedStrings #-}
module System.Handsy.Remote where
import Prelude hiding (readFile, writeFile)
import System.Handsy
import qualified Data.ByteString.Char8 as B
import Control.Monad.IO.Class
import Control.Monad.Trans.Free
data RemoteOptions =
RemoteOptions {
sshCommand :: (String, [String])
}
runRemote :: RemoteOptions -> Handsy a -> IO a
runRemote opts h = do
x <- runFreeT h
case x of
Pure r -> return r
Free (ReadFile fp next) -> do
(_, stdin, _) <- runSsh "cat" [fp] ""
runRemote opts (next stdin)
Free (WriteFile fp str next) -> do
_ <- runSsh "dd" ["of=" ++ fp] str -- TODO: Escape necessary?
runRemote opts (next ())
Free (Command prg args stdin next) -> runSsh prg args stdin >>= run . next
where
(ssh, sshOpts) = sshCommand opts
runSsh prg args stdin = run (command ssh (sshOpts ++ prg : args) stdin)