From 7e69e1665d501c47d79bd71650f098bd32c12171 Mon Sep 17 00:00:00 2001 From: Henry Dollman Date: Wed, 10 Jul 2024 12:54:02 -0400 Subject: [PATCH] react + updates --- main.go | 26 +-- site/bun.lockb | Bin 131289 -> 126391 bytes site/package.json | 12 +- site/src/components/add-server.tsx | 95 +++++---- site/src/components/command-dialog.tsx | 9 +- site/src/components/login.tsx | 16 +- site/src/components/routes/home.tsx | 8 +- site/src/components/routes/server.tsx | 6 +- .../components/server-table/data-table.tsx | 35 ++-- site/src/components/test.tsx | 23 --- site/src/components/ui/dialog.tsx | 150 ++++++-------- site/src/components/ui/toast.tsx | 127 ++++++++++++ site/src/components/ui/toaster.tsx | 33 +++ site/src/components/ui/use-toast.ts | 192 ++++++++++++++++++ site/src/index.css | 30 +-- site/src/lib/utils.ts | 23 ++- site/src/main.tsx | 28 +-- site/tsconfig.app.json | 3 - site/vite.config.ts | 4 +- 19 files changed, 579 insertions(+), 241 deletions(-) delete mode 100644 site/src/components/test.tsx create mode 100644 site/src/components/ui/toast.tsx create mode 100644 site/src/components/ui/toaster.tsx create mode 100644 site/src/components/ui/use-toast.ts diff --git a/main.go b/main.go index 2c458cd..c48ecd9 100644 --- a/main.go +++ b/main.go @@ -112,7 +112,7 @@ func main() { // start ticker for server updates app.OnBeforeServe().Add(func(e *core.ServeEvent) error { - // go serverUpdateTicker() + go serverUpdateTicker() return nil }) @@ -128,7 +128,7 @@ func main() { } func serverUpdateTicker() { - ticker := time.NewTicker(15 * time.Second) + ticker := time.NewTicker(60 * time.Second) for range ticker.C { updateServers() } @@ -144,7 +144,7 @@ func updateServers() { records := []*models.Record{} if err := query.All(&records); err != nil { - app.Logger().Error("Failed to get servers: ", "err", err) + app.Logger().Error("Failed to get servers: ", "err", err.Error()) // return nil, err } @@ -166,7 +166,7 @@ func updateServer(record *models.Record) { } client, err := getServerConnection(&server) if err != nil { - app.Logger().Error("Failed to connect:", "err", err, "server", server.Ip, "port", server.Port) + app.Logger().Error("Failed to connect:", "err", err.Error(), "server", server.Ip, "port", server.Port) // todo update record to not connected record.Set("active", false) delete(serverConnections, record.Id) @@ -178,7 +178,7 @@ func updateServer(record *models.Record) { // get server stats from agent systemData, err := requestJson(&server) if err != nil { - app.Logger().Error("Failed to get server stats: ", "err", err) + app.Logger().Error("Failed to get server stats: ", "err", err.Error()) record.Set("active", false) if server.Client != nil { server.Client.Close() @@ -190,7 +190,7 @@ func updateServer(record *models.Record) { record.Set("active", true) record.Set("stats", systemData.System) if err := app.Dao().SaveRecord(record); err != nil { - app.Logger().Error("Failed to update record: ", "err", err) + app.Logger().Error("Failed to update record: ", "err", err.Error()) } // add new system_stats record system_stats, _ := app.Dao().FindCollectionByNameOrId("system_stats") @@ -198,7 +198,7 @@ func updateServer(record *models.Record) { system_stats_record.Set("system", record.Id) system_stats_record.Set("stats", systemData.System) if err := app.Dao().SaveRecord(system_stats_record); err != nil { - app.Logger().Error("Failed to save record: ", "err", err) + app.Logger().Error("Failed to save record: ", "err", err.Error()) } // add new container_stats record if len(systemData.Containers) > 0 { @@ -207,7 +207,7 @@ func updateServer(record *models.Record) { container_stats_record.Set("system", record.Id) container_stats_record.Set("stats", systemData.Containers) if err := app.Dao().SaveRecord(container_stats_record); err != nil { - app.Logger().Error("Failed to save record: ", "err", err) + app.Logger().Error("Failed to save record: ", "err", err.Error()) } } } @@ -216,7 +216,7 @@ func getServerConnection(server *Server) (*ssh.Client, error) { // app.Logger().Debug("new ssh connection", "server", server.Ip) key, err := getSSHKey() if err != nil { - app.Logger().Error("Failed to get SSH key: ", "err", err) + app.Logger().Error("Failed to get SSH key: ", "err", err.Error()) return nil, err } time.Sleep(time.Second) @@ -284,27 +284,27 @@ func getSSHKey() ([]byte, error) { // Generate the Ed25519 key pair pubKey, privKey, err := ed25519.GenerateKey(nil) if err != nil { - // app.Logger().Error("Error generating key pair:", "err", err) + // app.Logger().Error("Error generating key pair:", "err", err.Error()) return nil, err } // Get the private key in OpenSSH format privKeyBytes, err := ssh.MarshalPrivateKey(privKey, "") if err != nil { - // app.Logger().Error("Error marshaling private key:", "err", err) + // app.Logger().Error("Error marshaling private key:", "err", err.Error()) return nil, err } // Save the private key to a file privateFile, err := os.Create("./pb_data/id_ed25519") if err != nil { - // app.Logger().Error("Error creating private key file:", "err", err) + // app.Logger().Error("Error creating private key file:", "err", err.Error()) return nil, err } defer privateFile.Close() if err := pem.Encode(privateFile, privKeyBytes); err != nil { - // app.Logger().Error("Error writing private key to file:", "err", err) + // app.Logger().Error("Error writing private key to file:", "err", err.Error()) return nil, err } diff --git a/site/bun.lockb b/site/bun.lockb index 072ffe227d79b32a6d26e26f2d03a6de4a3695a0..961a586c97aa565149a0af3e1650ed8683d6c1bc 100755 GIT binary patch delta 28984 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 Db{};_ delta 31489 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 + const port = useRef() as MutableRefObject + const publicKey = useStore($publicKey) + + function copyDockerCompose(port: string) { + copyToClipboard(`services: + agent: + image: 'henrygd/monitor-agent' + container_name: 'monitor-agent' + restart: unless-stopped + ports: + - '${port}:45876' + volumes: + - /var/run/docker.sock:/var/run/docker.sock`) + } + + useEffect(() => { + if (publicKey || !open) { + return + } + // get public key + pb.send('/getkey', {}).then(({ key }) => { + console.log('key', key) + $publicKey.set(key) + }) + }, [open]) async function handleSubmit(e: SubmitEvent) { e.preventDefault() const formData = new FormData(e.target as HTMLFormElement) - const stats = { + const data = Object.fromEntries(formData) as Record + data.stats = { cpu: 0, mem: 0, memUsed: 0, @@ -45,16 +59,10 @@ export function AddServerButton() { diskUsed: 0, diskPct: 0, } - const data = { stats } as Record - for (const [key, value] of formData) { - data[key.slice(2)] = value - } - console.log(data) - try { - const record = await pb.collection('systems').create(data) - console.log(record) setOpen(false) + await pb.collection('systems').create(data) + // console.log(record) } catch (e) { console.log(e) } @@ -73,57 +81,56 @@ export function AddServerButton() { Add New Server The agent must be running on the server to connect. Copy the{' '} - docker-compose.yml for the agent below. + docker-compose.yml for the agent + below. -
+
-
-
-
-
-