2 changed files with 57 additions and 4 deletions
@ -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) |
Loading…
Reference in new issue