Skip to content

Instantly share code, notes, and snippets.

@rochacon
Created December 8, 2014 20:17
Show Gist options
  • Star 19 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save rochacon/52420a3ab36b131e1437 to your computer and use it in GitHub Desktop.
Save rochacon/52420a3ab36b131e1437 to your computer and use it in GitHub Desktop.
Stream a command stderr and stdout throught websockets
package main
import (
"bufio"
"fmt"
"github.com/gorilla/websocket"
"io"
"log"
"net/http"
"os/exec"
)
var html = []byte(
`<html>
<body>
<h1>blah.exe</h1>
<code></code>
<script>
var ws = new WebSocket("ws://127.0.0.1:8000/ws")
ws.onmessage = function(e) {
document.querySelector("code").innerHTML += e.data + "<br>"
}
</script>
</body>
</html>
`)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
func main() {
http.HandleFunc("/ws", cmdToResponse)
http.HandleFunc("/", serveHtml)
log.Println("Listening on :8000")
err := http.ListenAndServe(":8000", nil)
if err != nil {
log.Fatal(err)
}
}
func cmdToResponse(w http.ResponseWriter, r *http.Request) {
ws, err := upgrader.Upgrade(w, r, nil)
if err != nil {
w.Write([]byte(fmt.Sprintf("", err)))
return
}
defer ws.Close()
// discard received messages
go func(c *websocket.Conn) {
for {
if _, _, err := c.NextReader(); err != nil {
c.Close()
break
}
}
}(ws)
ws.WriteMessage(1, []byte("Starting...\n"))
// execute and get a pipe
cmd := exec.Command("blah.exe")
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Println(err)
return
}
stderr, err := cmd.StderrPipe()
if err != nil {
log.Println(err)
return
}
if err := cmd.Start(); err != nil {
log.Println(err)
return
}
s := bufio.NewScanner(io.MultiReader(stdout, stderr))
for s.Scan() {
ws.WriteMessage(1, s.Bytes())
}
if err := cmd.Wait(); err != nil {
log.Println(err)
return
}
ws.WriteMessage(1, []byte("Finished\n"))
}
func serveHtml(w http.ResponseWriter, r *http.Request) {
w.Write(html)
}
@0x1BB736F
Copy link

thanks very much, bro :D

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment