diff --git a/cmd/qrunweb/main.go b/cmd/qrunweb/main.go index 752d15e..e32aeb6 100644 --- a/cmd/qrunweb/main.go +++ b/cmd/qrunweb/main.go @@ -1,11 +1,15 @@ package main import ( + "context" "embed" "fmt" "io/fs" + "net" "net/http" "os" + "os/exec" + "strings" ) //go:embed static @@ -13,8 +17,14 @@ var staticFS embed.FS func main() { addr := ":8080" - if len(os.Args) > 1 { - addr = os.Args[1] + var runAndExit []string + + for _, arg := range os.Args[1:] { + if v, ok := strings.CutPrefix(arg, "--run-and-exit="); ok { + runAndExit = strings.Fields(v) + } else { + addr = arg + } } sub, err := fs.Sub(staticFS, "static") @@ -25,6 +35,27 @@ func main() { http.Handle("/", http.FileServer(http.FS(sub))) + if len(runAndExit) > 0 { + ln, err := net.Listen("tcp", addr) + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %v\n", err) + os.Exit(1) + } + srv := &http.Server{} + go srv.Serve(ln) + + cmd := exec.Command(runAndExit[0], runAndExit[1:]...) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + cmdErr := cmd.Run() + srv.Shutdown(context.Background()) + if cmdErr != nil { + fmt.Fprintf(os.Stderr, "Error: %v\n", cmdErr) + os.Exit(1) + } + return + } + fmt.Printf("Listening on %s\n", addr) if err := http.ListenAndServe(addr, nil); err != nil { fmt.Fprintf(os.Stderr, "Error: %v\n", err) diff --git a/screenshot.sh b/screenshot.sh new file mode 100755 index 0000000..aceb46d --- /dev/null +++ b/screenshot.sh @@ -0,0 +1,2 @@ +#!/bin/bash +exec go run ./cmd/qrunweb/ "--run-and-exit=shot-scraper http://localhost:8080/ -o /tmp/timeline.png --width 1000 --height ${1:-1200}"