+12
-2
@@ -1,11 +1,21 @@
|
|||||||
links:
|
links:
|
||||||
- { name: Proxmox, url: "https://pve.local:8006" }
|
- { name: Gitea, url: "https://git.alexey-homelab.duckdns.org" }
|
||||||
- { name: Router, url: "http://192.168.1.1" }
|
- { 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:
|
monitor:
|
||||||
- name: cpu
|
- name: cpu
|
||||||
script: scripts/cpu.sh
|
script: scripts/cpu.sh
|
||||||
refresh: 5
|
refresh: 5
|
||||||
data: percentage
|
data: percentage
|
||||||
|
- name: disk
|
||||||
|
script: scripts/disk.sh
|
||||||
|
refresh: 60
|
||||||
|
data: percentage
|
||||||
|
- name: mem
|
||||||
|
script: scripts/mem.sh
|
||||||
|
refresh: 5
|
||||||
|
data: percentage
|
||||||
exec:
|
exec:
|
||||||
- name: greet
|
- name: greet
|
||||||
script: scripts/greet.sh
|
script: scripts/greet.sh
|
||||||
|
|||||||
Executable
+6
@@ -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
|
||||||
Executable
+3
@@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Заполненность RAM в процентах: ps %mem — уже доля от общей памяти, суммируем как есть (mac + linux).
|
||||||
|
ps -A -o %mem | awk '{s+=$1} END {printf "%d", s}'
|
||||||
+17
-1
@@ -56,6 +56,21 @@ func loadConfig(path string) (*Config, error) {
|
|||||||
if err := dec.Decode(&cfg); err != nil {
|
if err := dec.Decode(&cfg); err != nil {
|
||||||
return nil, fmt.Errorf("parse %s: %w", path, err)
|
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 {
|
for _, it := range cfg.Monitor {
|
||||||
if it.Refresh <= 0 {
|
if it.Refresh <= 0 {
|
||||||
return nil, fmt.Errorf("monitor %q: refresh must be > 0", it.Name)
|
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)
|
log.Printf("monitor %s: %v", sc.Name, err)
|
||||||
v = "error: " + err.Error()
|
v = "error: " + err.Error()
|
||||||
} else {
|
} 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)
|
s.monVals.Store(sc.Name, v)
|
||||||
time.Sleep(time.Duration(sc.Refresh) * time.Second)
|
time.Sleep(time.Duration(sc.Refresh) * time.Second)
|
||||||
|
|||||||
Reference in New Issue
Block a user