{-# OPTIONS_GHC -fno-warn-unused-imports #-} module System.Handsy.Tutorial ( -- * Introduction -- $introduction -- * Examples -- $examples ) where import System.Handsy import System.Handsy.Remote import System.Handsy.Util {- $introduction @handsy@ is a small library mainly for applications which should make some operations on remote machines by SSH. It currently provides you: * A DSL describing basic system operations('command', 'readFile', 'writeFile' etc.) * Two interpreters for running this DSL locally or via SSH('run' and 'runRemote') * Some utility functions for common commands('os', 'mkTemp' etc.) If you're looking for a shell scripting alternative, look at @turtle@, @shelly@ or @shellmate@ packages. @handsy@ is mostly relevant for the ability to apply simple commands remotely. -} {- $examples Here is a simple demonstration: @ import Control.Applicative ((\<$>)) import Control.Monad.IO.Class (liftIO) import qualified Data.ByteString.Lazy as B import qualified System.Handsy as H import qualified System.Handsy.Remote as H import qualified System.Handsy.Util as H demo :: H.Handsy B.ByteString demo = do os <- H.os -- We can do IO in Handsy monad liftIO . putStrLn $ "Hello from " ++ maybe \"UnknownOS\" show os ++ "!" tmpFile <- H.mkTemp "handsy" H.writeFile tmpFile "hello world!" H.stdout \<$\> H.command "cat" [tmpFile] H.def @ And now we can run it: @ runHere = 'H.run' H.def demo >>= print runThere = 'H.runRemote' H.def "root@google.com" H.def{H.sshPort=2222} demo >>= print @ > λ> runHere > Hello from NixOS! > "hello world!" > λ> runThere > Hello from CentOS! > "hello world!" Internally, Handsy converts the DSL terms into series of shell commands and 'run' and 'runRemote' functions describes how to apply those shell commands. You can see the given shell commands using 'debug' option: > λ> H.run H.def{debug=True} demo >>= print > cat /etc/os-release > Hello from NixOS! > mktemp $'--suffix=handsy' > dd $'of=/run/user/1002/tmp.N3TlYC9Jfwhandsy' > cat /run/user/1002/tmp.N3TlYC9Jfwhandsy > "hello world!" -}