From fb5cbc91f0d4faec14d9e86af4a5e355a047d344 Mon Sep 17 00:00:00 2001 From: Wesley Kerfoot Date: Wed, 22 Aug 2018 18:52:44 -0400 Subject: [PATCH 1/4] Update install instructions --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a4a3c20..af75bab 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Bolt is an automation DSL, similar to [http://fabfile.org](http://fabfile.org) ### Installation ``` git clone git@github.com:weskerfoot/Bolt.git -cd bolt; raco pkg install +raco pkg install ./bolt ``` Example: From a235d2e73baf16c04972ad72a83b66c0c0b62e62 Mon Sep 17 00:00:00 2001 From: Wesley Kerfoot Date: Sat, 22 Dec 2018 15:35:28 -0500 Subject: [PATCH 2/4] Switch to handmade SSH library ;) --- bolt/bolt.rkt | 7 +++---- bolt/execute.rkt | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 bolt/execute.rkt diff --git a/bolt/bolt.rkt b/bolt/bolt.rkt index 89a362d..1eb69b1 100755 --- a/bolt/bolt.rkt +++ b/bolt/bolt.rkt @@ -1,5 +1,6 @@ #lang racket +(require "execute.rkt") (require remote-shell/ssh) (require "directory.rkt") (require "shell_env.rkt") @@ -65,15 +66,13 @@ (displayln (format "Executed on ~a:" (remote-host (host)))) (match - (ssh (host) + ((make-exec (hostname)) (as-user (format "cd ~a && ~a ~a" (cwd) (format-vars (shell-env)) cmd) - ) - #:failure-log "/tmp/test.log" - #:mode 'output) + )) [(cons code output) (cons code (strip-first-line diff --git a/bolt/execute.rkt b/bolt/execute.rkt new file mode 100644 index 0000000..ebf9acd --- /dev/null +++ b/bolt/execute.rkt @@ -0,0 +1,54 @@ +#! /usr/bin/env racket +#lang racket + +(define (read-avail from-port callback) + (define ready + (sync + (read-bytes-evt 1 from-port))) + + (if (not (eof-object? ready)) + (begin + (callback ready) + (read-avail from-port callback)) + (callback #f))) + + +(define (execute-async to-port) + (define command (thread-receive)) + + (displayln command to-port) + + (flush-output to-port) + (execute-async to-port)) + +;; you tell it the remote, and pass it a callback +;; the callback gets hooked into another thread that waits for output +;; the callback executes on any output +;; the output might be parsed into a standard format + +(define (make-executor host callback) + + (match-define (list from-remote + to-remote + pid + error-from-remote + control-remote) + (process (format "ssh -tt ~a" host))) + + (thread + (lambda () (read-avail from-remote callback))) + + (define + executor + (thread (lambda () (execute-async to-remote)))) + + (lambda (command) + (thread-send executor command))) + +(define (make-exec hostname) + (make-executor + hostname + (lambda (result) + (display result)))) + +(provide make-exec) From 91e3663005b98056879a0a9116b3f8ac10f7417c Mon Sep 17 00:00:00 2001 From: Wesley Kerfoot Date: Sat, 22 Dec 2018 15:47:31 -0500 Subject: [PATCH 3/4] Set the executor for the entire lifetime of with-host --- bolt/bolt.rkt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/bolt/bolt.rkt b/bolt/bolt.rkt index 1eb69b1..d8737e8 100755 --- a/bolt/bolt.rkt +++ b/bolt/bolt.rkt @@ -26,6 +26,9 @@ (define commands (make-parameter #f)) +(define executor + (make-parameter #f)) + (define-syntax-rule (plan expr ...) (parameterize @@ -45,7 +48,8 @@ (with-host remote expr ...) (parameterize ([host remote] - [hostname (remote-host remote)]) + [hostname (remote-host remote)] + [executor (make-exec (remote-host remote))]) (begin expr ...))) (define-syntax-rule @@ -66,7 +70,7 @@ (displayln (format "Executed on ~a:" (remote-host (host)))) (match - ((make-exec (hostname)) + ((executor) (as-user (format "cd ~a && ~a ~a" (cwd) From 1c60f3acda3aec03adfadf6628e5a8748ebeb9a6 Mon Sep 17 00:00:00 2001 From: Wesley Kerfoot Date: Sun, 10 Feb 2019 00:41:52 -0500 Subject: [PATCH 4/4] Reorganize things a bit --- bolt/bolt.rkt | 112 +------------------------------------------- bolt/library.rkt | 67 ++++++++++++++++++++++++++ bolt/parameters.rkt | 54 +++++++++++++++++++++ 3 files changed, 123 insertions(+), 110 deletions(-) create mode 100644 bolt/library.rkt create mode 100644 bolt/parameters.rkt diff --git a/bolt/bolt.rkt b/bolt/bolt.rkt index d8737e8..89e3d26 100755 --- a/bolt/bolt.rkt +++ b/bolt/bolt.rkt @@ -1,114 +1,6 @@ #lang racket -(require "execute.rkt") -(require remote-shell/ssh) -(require "directory.rkt") -(require "shell_env.rkt") - -(define (strip-first-line st) - (string-join - (cdr - (string-split st "\n")) - "\n")) - -(define cwd - (make-parameter "~")) - -(define host - (make-parameter #f)) - -(define hostname - (make-parameter #f)) - -(define user - (make-parameter #f)) - -(define commands - (make-parameter #f)) - -(define executor - (make-parameter #f)) - -(define-syntax-rule - (plan expr ...) - (parameterize - ([commands (list)]) - (begin expr ...))) - -(define-syntax-rule - (with-cwd dir expr ...) - (parameterize - ([cwd - (match (substring dir 0 1) - ["/" dir] - [_ (format "~a/~a" (cwd) dir)])]) - (begin expr ...))) - -(define-syntax-rule - (with-host remote expr ...) - (parameterize - ([host remote] - [hostname (remote-host remote)] - [executor (make-exec (remote-host remote))]) - (begin expr ...))) - -(define-syntax-rule - (become username expr ...) - (parameterize - ([user username]) - (begin expr ...))) - -(define (as-user cmd) - (if - (user) - (format "sudo -u ~a sh -c '~a'" - (user) - cmd) - cmd)) - -(define (exec cmd) - (displayln - (format "Executed on ~a:" (remote-host (host)))) - (match - ((executor) - (as-user - (format "cd ~a && ~a ~a" - (cwd) - (format-vars (shell-env)) - cmd) - )) - [(cons code output) - (cons code - (strip-first-line - (bytes->string/utf-8 output)))] - [output output])) - -(define (copy-file source dest) - (displayln - (format "Copying file to ~a:" (remote-host (host)))) - (scp - (host) - source - (format "~a@~a:~a" (user) (remote-host (host)) dest) - #:mode 'result)) - -(define (copy-dir source dest) - (define tar-path (compress source)) - (copy-file tar-path tar-path) - (remove-tmp tar-path) - (exec (format "mkdir -p ~a" dest)) - (exec (format "tar -xzvf ~a -C ~a" tar-path dest)) - (exec (format "rm ~a" tar-path))) - -(define ((make-cmd cmd)) (exec cmd)) - -(define ls (make-cmd "ls")) -(define pwd (make-cmd "pwd")) +(require "library.rkt") (provide - (all-defined-out) - remote - compress - shell-env - format-vars - with-shell-vars) + (all-from-out "library.rkt")) diff --git a/bolt/library.rkt b/bolt/library.rkt new file mode 100644 index 0000000..a4a6b86 --- /dev/null +++ b/bolt/library.rkt @@ -0,0 +1,67 @@ +#lang racket + +(require remote-shell/ssh) +(require "directory.rkt") +(require "shell_env.rkt") +(require "parameters.rkt") + +;; Helper function +(define (strip-first-line st) + (string-join + (cdr + (string-split st "\n")) + "\n")) + +(define (as-user cmd) + (if + (user) + (format "sudo -u ~a sh -c '~a'" + (user) + cmd) + cmd)) + +(define (exec cmd) + (displayln + (format "Executed on ~a:" (remote-host (host)))) + (match + ((executor) + (as-user + (format "cd ~a && ~a ~a" + (cwd) + (format-vars (shell-env)) + cmd) + )) + [(cons code output) + (cons code + (strip-first-line + (bytes->string/utf-8 output)))] + [output output])) + +(define (copy-file source dest) + (displayln + (format "Copying file to ~a:" (remote-host (host)))) + (scp + (host) + source + (format "~a@~a:~a" (user) (remote-host (host)) dest) + #:mode 'result)) + +(define (copy-dir source dest) + (define tar-path (compress source)) + (copy-file tar-path tar-path) + (remove-tmp tar-path) + (exec (format "mkdir -p ~a" dest)) + (exec (format "tar -xzvf ~a -C ~a" tar-path dest)) + (exec (format "rm ~a" tar-path))) + +(define ((make-cmd cmd)) (exec cmd)) + +(define ls (make-cmd "ls")) +(define pwd (make-cmd "pwd")) + +(provide + (all-from-out remote-shell/ssh) + (all-from-out "parameters.rkt") + (all-from-out "directory.rkt") + (all-from-out "shell_env.rkt") + (all-defined-out)) diff --git a/bolt/parameters.rkt b/bolt/parameters.rkt new file mode 100644 index 0000000..63dfc3c --- /dev/null +++ b/bolt/parameters.rkt @@ -0,0 +1,54 @@ +#lang racket + +(require remote-shell/ssh) +(require "execute.rkt") + +(define cwd + (make-parameter "~")) + +(define host + (make-parameter #f)) + +(define hostname + (make-parameter #f)) + +(define user + (make-parameter #f)) + +(define commands + (make-parameter #f)) + +(define executor + (make-parameter #f)) + +(define-syntax-rule + (plan expr ...) + (parameterize + ([commands (list)]) + (begin expr ...))) + +(define-syntax-rule + (with-cwd dir expr ...) + (parameterize + ([cwd + (match (substring dir 0 1) + ["/" dir] + [_ (format "~a/~a" (cwd) dir)])]) + (begin expr ...))) + +(define-syntax-rule + (with-host remote expr ...) + (parameterize + ([host remote] + [hostname (remote-host remote)] + [executor (make-exec (remote-host remote))]) + (begin expr ...))) + +(define-syntax-rule + (become username expr ...) + (parameterize + ([user username]) + (begin expr ...))) + +(provide + (all-defined-out))