package deviceinfo import ( "os" "runtime" "strconv" "strings" "time" "networktool/internal/config" "networktool/internal/model" ) type Service struct { cfg config.Config startedAt time.Time } func New(cfg config.Config) *Service { return &Service{cfg: cfg, startedAt: time.Now()} } func (s *Service) Get() model.DeviceInfo { hostname, _ := os.Hostname() if hostname == "" { hostname = s.cfg.DeviceIDFallback } return model.DeviceInfo{ DeviceID: readMachineID(s.cfg.DeviceIDFallback), Hostname: hostname, OSVersion: readOSVersion(), ServerVersion: s.cfg.ServerVersion, UptimeSeconds: int64(time.Since(s.startedAt).Seconds()), } } func readMachineID(fallback string) string { for _, path := range []string{"/etc/machine-id", "/var/lib/dbus/machine-id"} { data, err := os.ReadFile(path) if err == nil { value := strings.TrimSpace(string(data)) if value != "" { return value } } } return fallback } func readOSVersion() string { data, err := os.ReadFile("/etc/os-release") if err != nil { return runtime.GOOS } for _, line := range strings.Split(string(data), "\n") { if strings.HasPrefix(line, "PRETTY_NAME=") { return strings.Trim(strconv.Quote(strings.Trim(strings.TrimPrefix(line, "PRETTY_NAME="), `"`)), `"`) } } return runtime.GOOS }