From e4f58e820f0fece034e5e3b18ee1a52626babacf Mon Sep 17 00:00:00 2001 From: Alexey Bagno Date: Sat, 29 Aug 2026 14:41:40 +0500 Subject: [PATCH] New scripts --- config.yaml | 14 ++++++++++++-- scripts/disk.sh | 6 ++++++ scripts/mem.sh | 3 +++ server/main.go | 18 +++++++++++++++++- 4 files changed, 38 insertions(+), 3 deletions(-) create mode 100755 scripts/disk.sh create mode 100755 scripts/mem.sh diff --git a/config.yaml b/config.yaml index 8aa882d..22cecbe 100644 --- a/config.yaml +++ b/config.yaml @@ -1,11 +1,21 @@ links: - - { name: Proxmox, url: "https://pve.local:8006" } - - { name: Router, url: "http://192.168.1.1" } + - { name: Gitea, url: "https://git.alexey-homelab.duckdns.org" } + - { name: Files, url: "https://files.alexey-homelab.duckdns.org/files/srv/" } + - { name: MinePanel, url: "https://mc.alexey-homelab.duckdns.org"} + - { name: PullMD, url: "https://pullmd.alexey-homelab.duckdns.org" } monitor: - name: cpu script: scripts/cpu.sh refresh: 5 data: percentage + - name: disk + script: scripts/disk.sh + refresh: 60 + data: percentage + - name: mem + script: scripts/mem.sh + refresh: 5 + data: percentage exec: - name: greet script: scripts/greet.sh diff --git a/scripts/disk.sh b/scripts/disk.sh new file mode 100755 index 0000000..429610a --- /dev/null +++ b/scripts/disk.sh @@ -0,0 +1,6 @@ +#!/bin/sh +# Заполненность корневого раздела в процентах (linux + mac). +case "$(uname)" in + Darwin) df -k / | awk 'NR==2 {print $5}' | tr -d '%' ;; + *) df -Pk / | awk 'NR==2 {print $5}' | tr -d '%' ;; +esac diff --git a/scripts/mem.sh b/scripts/mem.sh new file mode 100755 index 0000000..4d6f38c --- /dev/null +++ b/scripts/mem.sh @@ -0,0 +1,3 @@ +#!/bin/sh +# Заполненность RAM в процентах: ps %mem — уже доля от общей памяти, суммируем как есть (mac + linux). +ps -A -o %mem | awk '{s+=$1} END {printf "%d", s}' diff --git a/server/main.go b/server/main.go index 7e9ddbd..729abb6 100644 --- a/server/main.go +++ b/server/main.go @@ -56,6 +56,21 @@ func loadConfig(path string) (*Config, error) { if err := dec.Decode(&cfg); err != nil { return nil, fmt.Errorf("parse %s: %w", path, err) } + seen := map[string]bool{} // item names are global keys (monVals, RunScript) + for _, l := range cfg.Links { + if seen[l.Name] { + return nil, fmt.Errorf("duplicate name %q", l.Name) + } + seen[l.Name] = true + } + for _, list := range [][]Item{cfg.Monitor, cfg.Exec} { + for _, it := range list { + if seen[it.Name] { + return nil, fmt.Errorf("duplicate name %q", it.Name) + } + seen[it.Name] = true + } + } for _, it := range cfg.Monitor { if it.Refresh <= 0 { return nil, fmt.Errorf("monitor %q: refresh must be > 0", it.Name) @@ -109,7 +124,8 @@ func (s *server) startMonitors() { log.Printf("monitor %s: %v", sc.Name, err) v = "error: " + err.Error() } else { - log.Printf("monitor %s -> %s", sc.Name, strings.TrimSpace(v)) + v = strings.TrimSpace(v) + log.Printf("monitor %s -> %s", sc.Name, v) } s.monVals.Store(sc.Name, v) time.Sleep(time.Duration(sc.Refresh) * time.Second)