From 05f5c94764286e8cbc6132fb79afd9015361cbce Mon Sep 17 00:00:00 2001 From: Henry Dollman Date: Fri, 12 Jul 2024 22:24:28 -0400 Subject: [PATCH] add pause functionality and updating favicon --- main.go | 18 +- migrations/1720568457_collections_snapshot.go | 27 ++- site/src/components/add-server.tsx | 5 +- site/src/components/charts/cpu-chart.tsx | 3 - .../components/server-table/data-table.tsx | 181 +++++++++--------- site/src/main.tsx | 14 +- site/src/types.d.ts | 4 +- types.go | 2 +- 8 files changed, 133 insertions(+), 121 deletions(-) diff --git a/main.go b/main.go index e5ba1cd..38bb464 100644 --- a/main.go +++ b/main.go @@ -16,6 +16,7 @@ import ( "time" "github.com/labstack/echo/v5" + "github.com/pocketbase/dbx" "github.com/pocketbase/pocketbase" "github.com/pocketbase/pocketbase/apis" "github.com/pocketbase/pocketbase/core" @@ -130,7 +131,7 @@ func main() { } func serverUpdateTicker() { - ticker := time.NewTicker(60 * time.Second) + ticker := time.NewTicker(30 * time.Second) for range ticker.C { updateServers() } @@ -140,6 +141,7 @@ func updateServers() { // serverCount := len(serverConnections) // fmt.Println("server count: ", serverCount) query := app.Dao().RecordQuery("systems"). + Where(dbx.NewExp("status != \"paused\"")). OrderBy("updated ASC"). // todo get total count of servers and divide by 4 or something Limit(5) @@ -163,12 +165,12 @@ func updateServer(record *models.Record) { } else { // create server connection struct server = Server{ - Ip: record.Get("ip").(string), + Host: record.Get("host").(string), Port: record.Get("port").(string), } client, err := getServerConnection(&server) if err != nil { - app.Logger().Error("Failed to connect:", "err", err.Error(), "server", server.Ip, "port", server.Port) + app.Logger().Error("Failed to connect:", "err", err.Error(), "server", server.Host, "port", server.Port) setInactive(record) return } @@ -183,7 +185,7 @@ func updateServer(record *models.Record) { return } // update system record - record.Set("active", true) + record.Set("status", "up") record.Set("stats", systemData.System) if err := app.Dao().SaveRecord(record); err != nil { app.Logger().Error("Failed to update record: ", "err", err.Error()) @@ -208,7 +210,7 @@ func updateServer(record *models.Record) { } } -// set server to inactive and close connection +// set server to status down and close connection func setInactive(record *models.Record) { // if in map, close connection and remove from map if _, ok := serverConnections[record.Id]; ok { @@ -218,14 +220,14 @@ func setInactive(record *models.Record) { delete(serverConnections, record.Id) } // set inactive - record.Set("active", false) + record.Set("status", "down") if err := app.Dao().SaveRecord(record); err != nil { app.Logger().Error("Failed to update record: ", "err", err.Error()) } } func getServerConnection(server *Server) (*ssh.Client, error) { - // app.Logger().Debug("new ssh connection", "server", server.Ip) + // app.Logger().Debug("new ssh connection", "server", server.Host) key, err := getSSHKey() if err != nil { app.Logger().Error("Failed to get SSH key: ", "err", err.Error()) @@ -248,7 +250,7 @@ func getServerConnection(server *Server) (*ssh.Client, error) { Timeout: 5 * time.Second, } - client, err := ssh.Dial("tcp", fmt.Sprintf("%s:%s", server.Ip, server.Port), config) + client, err := ssh.Dial("tcp", fmt.Sprintf("%s:%s", server.Host, server.Port), config) if err != nil { return nil, err } diff --git a/migrations/1720568457_collections_snapshot.go b/migrations/1720568457_collections_snapshot.go index 7e67ab4..fdb2198 100644 --- a/migrations/1720568457_collections_snapshot.go +++ b/migrations/1720568457_collections_snapshot.go @@ -15,7 +15,7 @@ func init() { { "id": "_pb_users_auth_", "created": "2024-07-07 15:59:04.262Z", - "updated": "2024-07-07 20:52:28.847Z", + "updated": "2024-07-09 23:42:40.542Z", "name": "users", "type": "auth", "system": false, @@ -78,7 +78,7 @@ func init() { { "id": "2hz5ncl8tizk5nx", "created": "2024-07-07 16:08:20.979Z", - "updated": "2024-07-09 22:46:22.047Z", + "updated": "2024-07-13 01:18:43.529Z", "name": "systems", "type": "base", "system": false, @@ -99,18 +99,25 @@ func init() { }, { "system": false, - "id": "4fbh8our", - "name": "active", - "type": "bool", - "required": false, + "id": "waj7seaf", + "name": "status", + "type": "select", + "required": true, "presentable": false, "unique": false, - "options": {} + "options": { + "maxSelect": 1, + "values": [ + "up", + "down", + "paused" + ] + } }, { "system": false, "id": "ve781smf", - "name": "ip", + "name": "host", "type": "text", "required": true, "presentable": false, @@ -161,7 +168,7 @@ func init() { { "id": "ej9oowivz8b2mht", "created": "2024-07-07 16:09:09.179Z", - "updated": "2024-07-07 20:52:28.848Z", + "updated": "2024-07-09 23:42:40.542Z", "name": "system_stats", "type": "base", "system": false, @@ -208,7 +215,7 @@ func init() { { "id": "juohu4jipgc13v7", "created": "2024-07-07 16:09:57.976Z", - "updated": "2024-07-07 20:52:28.848Z", + "updated": "2024-07-09 23:42:40.542Z", "name": "container_stats", "type": "base", "system": false, diff --git a/site/src/components/add-server.tsx b/site/src/components/add-server.tsx index 6aa0b93..bfea18e 100644 --- a/site/src/components/add-server.tsx +++ b/site/src/components/add-server.tsx @@ -53,6 +53,7 @@ export function AddServerButton() { e.preventDefault() const formData = new FormData(e.target as HTMLFormElement) const data = Object.fromEntries(formData) as Record + data.status = 'down' data.stats = { c: 0, d: 0, @@ -97,10 +98,10 @@ export function AddServerButton() {
-
- - - - - Are you sure you want to delete {deleteServer.name}? - - - This action cannot be undone. This will permanently delete all current records for{' '} - {deleteServer.name} from the - database. - - - - setDeleteServer({} as SystemRecord)}> - Cancel - - { - setDeleteServer({} as SystemRecord) - pb.collection('systems').delete(deleteServer.id) - }} - > - Continue - - - - ) } diff --git a/site/src/main.tsx b/site/src/main.tsx index 668f8b3..431bfee 100644 --- a/site/src/main.tsx +++ b/site/src/main.tsx @@ -34,11 +34,17 @@ const App = () => { useEffect(() => { if (!authenticated || !servers.length) { updateFavicon('/favicon.svg') - } else if (servers.find((server) => !server.active)) { - updateFavicon('/favicon-red.svg') } else { - // all servers good - updateFavicon('/favicon-green.svg') + let up = false + for (const server of servers) { + if (server.status === 'down') { + updateFavicon('/favicon-red.svg') + return + } else if (server.status === 'up') { + up = true + } + } + updateFavicon(up ? '/favicon-green.svg' : '/favicon.svg') } }, [authenticated, servers]) diff --git a/site/src/types.d.ts b/site/src/types.d.ts index 45e0bb6..fab340d 100644 --- a/site/src/types.d.ts +++ b/site/src/types.d.ts @@ -2,8 +2,8 @@ import { RecordModel } from 'pocketbase' export interface SystemRecord extends RecordModel { name: string - ip: string - active: boolean + host: string + status: 'up' | 'down' | 'paused' port: string stats: SystemStats } diff --git a/types.go b/types.go index 1153cda..a8d8954 100644 --- a/types.go +++ b/types.go @@ -5,7 +5,7 @@ import ( ) type Server struct { - Ip string + Host string Port string Client *ssh.Client }