Some more changes to the client. I got a grasp on how this may work.

This commit is contained in:
2025-02-04 01:22:31 +01:00
parent e7e8953ec3
commit 6d76a88c9c
6 changed files with 106 additions and 12 deletions

View File

@ -9,27 +9,37 @@ import (
"time"
"github.com/gorilla/websocket"
"github.com/inhies/go-bytesize"
"github.com/mackerelio/go-osstat/memory"
"github.com/shirou/gopsutil/v4/cpu"
)
func (client *Client) Start() {
// Setup the interrupts
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, os.Interrupt)
u := url.URL{Scheme: "ws", Host: client.ServerAddress + ":" + strconv.Itoa(client.ServerPort), Path: "/ws"}
log.Printf("connecting to %s", u.String())
log.Printf("Connecting to %s", u.String())
c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
// sigh
var err error
client.conn, _, err = websocket.DefaultDialer.Dial(u.String(), nil)
if err != nil {
log.Fatal("dial:", err)
}
defer c.Close()
defer client.conn.Close()
done := make(chan struct{})
// Setup updater logic
updater := make(chan string)
go client.statusUpdater(updater)
go func() {
defer close(done)
for {
_, message, err := c.ReadMessage()
_, message, err := client.conn.ReadMessage()
if err != nil {
log.Println("read:", err)
return
@ -38,15 +48,13 @@ func (client *Client) Start() {
}
}()
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for {
select {
case <-done:
return
case t := <-ticker.C:
err := c.WriteMessage(websocket.TextMessage, []byte(t.String()))
case update := <-updater: // Dumping this into a var saves a second. Weird!
// Dump the message towards the server.
err = client.conn.WriteMessage(websocket.TextMessage, []byte(update))
if err != nil {
log.Println("write:", err)
return
@ -56,7 +64,7 @@ func (client *Client) Start() {
// Cleanly close the connection by sending a close message and then
// waiting (with timeout) for the server to close the connection.
err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
err := client.conn.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
if err != nil {
log.Println("write close:", err)
return
@ -70,3 +78,25 @@ func (client *Client) Start() {
}
}
func (client *Client) statusUpdater(updater chan string) {
for {
// Fetch CPU usage in percentages
cpustats, err := cpu.Percent(time.Second, false)
if err != nil {
log.Println("Err:", err)
}
// Fetch memory stats in bytes
mem, err := memory.Get()
if err != nil {
log.Println("Err:", err)
}
// Use the ByteSize package to allow for memory calculations
b := bytesize.New(float64(mem.Used))
// Dump the message towards the server.
updater <- "update;" + strconv.Itoa(int(cpustats[0])) + ";" + b.String() + ";" + strconv.Itoa(client.taskId)
}
}

View File

@ -1,6 +1,10 @@
package client
import "github.com/gorilla/websocket"
type Client struct {
ServerAddress string
ServerPort int
taskId int
conn *websocket.Conn
}