Files
komari-agent/monitoring/unit/os_linux.go
JohnsonRan d0b9ceb38a feat: add Synology support
Signed-off-by: JohnsonRan <me@ihtw.moe>
2025-07-30 19:17:10 +08:00

98 lines
1.9 KiB
Go

//go:build !windows
// +build !windows
package monitoring
import (
"bufio"
"os"
"strings"
)
func OSName() string {
if synologyName := detectSynology(); synologyName != "" {
return synologyName
}
file, err := os.Open("/etc/os-release")
if err != nil {
return "Linux"
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
if strings.HasPrefix(line, "PRETTY_NAME=") {
return strings.Trim(line[len("PRETTY_NAME="):], `"`)
}
}
if err := scanner.Err(); err != nil {
return "Linux"
}
return "Linux"
}
func detectSynology() string {
synologyFiles := []string{
"/etc/synoinfo.conf",
"/etc.defaults/synoinfo.conf",
}
for _, file := range synologyFiles {
if info, err := os.Stat(file); err == nil && !info.IsDir() {
if synologyInfo := readSynologyInfo(file); synologyInfo != "" {
return synologyInfo
}
}
}
if info, err := os.Stat("/usr/syno"); err == nil && info.IsDir() {
return "Synology DSM"
}
return ""
}
func readSynologyInfo(filename string) string {
file, err := os.Open(filename)
if err != nil {
return ""
}
defer file.Close()
var unique, udcCheckState string
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := strings.TrimSpace(scanner.Text())
if strings.HasPrefix(line, "unique=") {
unique = strings.Trim(strings.TrimPrefix(line, "unique="), `"`)
} else if strings.HasPrefix(line, "udc_check_state=") {
udcCheckState = strings.Trim(strings.TrimPrefix(line, "udc_check_state="), `"`)
}
}
if unique != "" && strings.Contains(unique, "synology_") {
parts := strings.Split(unique, "_")
if len(parts) >= 3 {
model := strings.ToUpper(parts[len(parts)-1])
result := "Synology " + model
if udcCheckState != "" {
result += " DSM " + udcCheckState
} else {
result += " DSM"
}
return result
}
}
return ""
}