You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.2 KiB
54 lines
1.2 KiB
#! /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)
|
|
|