From e1b88f0c4041a1688bca901523a1666b327eadf8 Mon Sep 17 00:00:00 2001 From: qowevisa Date: Fri, 7 Jun 2024 09:48:16 +0300 Subject: [PATCH] Add cgui --- cmd/cgui/main.go | 102 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 cmd/cgui/main.go diff --git a/cmd/cgui/main.go b/cmd/cgui/main.go new file mode 100644 index 0000000..bd9a5ac --- /dev/null +++ b/cmd/cgui/main.go @@ -0,0 +1,102 @@ +package main + +import ( + "crypto/tls" + "crypto/x509" + "fmt" + "log" + "net" + "net/url" + "os" + + "git.qowevisa.me/Qowevisa/gotell/communication" + "git.qowevisa.me/Qowevisa/gotell/env" + "github.com/gorilla/websocket" +) + +func main() { + loadingFileName := env.ServerFullchainFileName + cert, err := os.ReadFile(loadingFileName) + if err != nil { + log.Fatalf("client: load root cert: %s", err) + } + log.Printf("Certificate %s loaded successfully!\n", loadingFileName) + // + roots := x509.NewCertPool() + if ok := roots.AppendCertsFromPEM(cert); !ok { + log.Fatalf("client: failed to parse root certificate") + } + + config := &tls.Config{ + RootCAs: roots, + } + + host, err := env.GetHost() + if err != nil { + log.Fatal(err) + } + port, err := env.GetPort() + if err != nil { + log.Fatal(err) + } + + service := fmt.Sprintf("%s:%d", host, port) + conn, err := tls.Dial("tcp", service, config) + if err != nil { + log.Fatalf("client: dial: %s", err) + } + defer conn.Close() + log.Printf("client: connected to %s", service) + + // Connect to the Electron.js application via WebSocket + u := url.URL{Scheme: "ws", Host: "localhost:8081", Path: "/ws"} + ws, _, err := websocket.DefaultDialer.Dial(u.String(), nil) + if err != nil { + log.Fatal("dial:", err) + } + defer ws.Close() + + go readFromServer(conn, ws) + go readFromWebSocket(conn, ws) + select {} +} + +func readFromServer(conn net.Conn, ws *websocket.Conn) { + buf := make([]byte, 512) + for { + n, err := conn.Read(buf) + if err != nil { + log.Printf("client: read: %s", err) + return + } + msg, err := communication.Decode(buf[:n]) + if err != nil { + log.Printf("ERROR: %#v\n", err) + continue + } + if msg == nil { + continue + } + log.Printf("client: received message from server: %v", *msg) + ws.WriteJSON(*msg) + } +} + +func readFromWebSocket(conn net.Conn, ws *websocket.Conn) { + for { + var msg communication.Message + err := ws.ReadJSON(&msg) + if err != nil { + log.Printf("WebSocket read error: %s", err) + return + } + log.Printf("client: received message from Electron: %v", msg) + encodedMsg, err := msg.Bytes() + if err != nil { + log.Printf("Encoding error: %s", err) + continue + } + conn.Write(encodedMsg) + } +} +