diff --git a/.gitignore b/.gitignore index 50c8dda..7c2aa52 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,4 @@ dist-ssr *.sw? .env +server/server diff --git a/Makefile b/Makefile index ce6aab9..50fcd46 100644 --- a/Makefile +++ b/Makefile @@ -1,23 +1,26 @@ -.PHONY: build deploy clean start default +.PHONY: deploy clean start default frontend -default: start +server/server: frontend + rm -rf server/dist + mv dist server/ + CGO_ENABLED=0 go -C server build . -build: +frontend: npm run build -deploy: build - scp -r dist kiosk: +deploy: server/server + scp server/server kiosk: clean: - rm -rf dist + rm -rf dist server/dist server/server start: deploy # TODO: This doesn't kill weston nicely; I should handle that? Or background or something - ssh kiosk "pgrep -f 'python3 -m http.server' || python3 -m http.server --directory /home/chandler/dist 127.0.0.1:8000 &" + ssh kiosk "pgrep -f './server' || ./server" #ssh kiosk "pkill -f 'weston --shell=kiosk-shell.so' || true" ssh kiosk weston --shell=kiosk-shell.so -- firefox --kiosk localhost:8000 --remote-debugging-port=9222 debug: deploy - ssh kiosk "pgrep -f 'python3 -m http.server' || python3 -m http.server --directory /home/chandler/dist 127.0.0.1:8000 &" + ssh kiosk "pgrep -f './server' || ./server" #ssh kiosk "pkill -f 'weston --shell=kiosk-shell.so' || true" ssh -L 6000:localhost:6000 kiosk weston --shell=kiosk-shell.so -- firefox --kiosk localhost:8000 --start-debugger-server 6000 diff --git a/server/go.mod b/server/go.mod new file mode 100644 index 0000000..72330de --- /dev/null +++ b/server/go.mod @@ -0,0 +1,3 @@ +module git.chandlerswift.com/chandlerswift/digital-turntable/server + +go 1.25.5 diff --git a/server/main.go b/server/main.go new file mode 100644 index 0000000..6ab1ecf --- /dev/null +++ b/server/main.go @@ -0,0 +1,37 @@ +package main + +import ( + "embed" + "fmt" + "log" + "net/http" + "os" +) + +//go:embed dist +var webUI embed.FS + +func setReader(state string) error { + // echo 'on' > '/sys/bus/usb/devices/1-1/power/control' # or 'auto' + switch state { + case "auto", "on": + return os.WriteFile("/sys/bus/usb/devices/1-1/power/control", []byte(state), 0) + default: + return fmt.Errorf("unknown state %q", state) + } +} + +func main() { + setReader("on") + http.Handle("/", http.FileServerFS(webUI)) + + http.HandleFunc("POST /api/reader/{state}", func(w http.ResponseWriter, r *http.Request) { + if err := setReader(r.PathValue("state")); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Write([]byte("ok")) + }) + + log.Fatal(http.ListenAndServe("127.0.0.1:8000", nil)) +}