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 072ffe2..961a586 100755 Binary files a/site/bun.lockb and b/site/bun.lockb differ diff --git a/site/package.json b/site/package.json index 4947b42..bb13a32 100644 --- a/site/package.json +++ b/site/package.json @@ -9,29 +9,33 @@ "preview": "vite preview" }, "dependencies": { - "@nanostores/preact": "^0.5.1", + "@nanostores/react": "^0.7.2", "@radix-ui/react-alert-dialog": "^1.1.1", "@radix-ui/react-dialog": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-toast": "^1.2.1", "@radix-ui/react-tooltip": "^1.1.2", "@tanstack/react-table": "^8.19.2", + "@vitejs/plugin-react": "^4.3.1", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "cmdk": "^1.0.0", "lucide-react": "^0.401.0", "nanostores": "^0.10.3", "pocketbase": "^0.21.3", - "preact": "^10.22.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", "tailwind-merge": "^2.4.0", "tailwindcss-animate": "^1.0.7", "valibot": "^0.36.0", - "wouter-preact": "^3.3.1" + "wouter": "^3.3.1" }, "devDependencies": { - "@preact/preset-vite": "^2.8.3", "@types/bun": "^1.1.6", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", "autoprefixer": "^10.4.19", "postcss": "^8.4.39", "tailwindcss": "^3.4.4", diff --git a/site/src/components/add-server.tsx b/site/src/components/add-server.tsx index 394d8d7..fbede53 100644 --- a/site/src/components/add-server.tsx +++ b/site/src/components/add-server.tsx @@ -14,29 +14,43 @@ import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { $publicKey, pb } from '@/lib/stores' import { ClipboardIcon, Plus } from 'lucide-react' -import { MutableRef, useRef, useState } from 'preact/hooks' - -function copyDockerCompose(port: string) { - console.log('copying docker compose') - navigator.clipboard.writeText(`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`) -} +import { useState, useRef, MutableRefObject, useEffect } from 'react' +import { useStore } from '@nanostores/react' +import { copyToClipboard } from '@/lib/utils' export function AddServerButton() { const [open, setOpen] = useState(false) - const port = useRef() as MutableRef + 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. -
+
-
-
-
-
-