deviceinfo.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package deviceinfo
  2. import (
  3. "os"
  4. "runtime"
  5. "strconv"
  6. "strings"
  7. "time"
  8. "quickip/internal/config"
  9. "quickip/internal/model"
  10. )
  11. type Service struct {
  12. cfg config.Config
  13. startedAt time.Time
  14. }
  15. func New(cfg config.Config) *Service {
  16. return &Service{cfg: cfg, startedAt: time.Now()}
  17. }
  18. func (s *Service) Get() model.DeviceInfo {
  19. hostname, _ := os.Hostname()
  20. if hostname == "" {
  21. hostname = s.cfg.DeviceIDFallback
  22. }
  23. return model.DeviceInfo{
  24. DeviceID: readMachineID(s.cfg.DeviceIDFallback),
  25. Hostname: hostname,
  26. OSVersion: readOSVersion(),
  27. AgentVersion: s.cfg.AgentVersion,
  28. UptimeSeconds: int64(time.Since(s.startedAt).Seconds()),
  29. }
  30. }
  31. func readMachineID(fallback string) string {
  32. for _, path := range []string{"/etc/machine-id", "/var/lib/dbus/machine-id"} {
  33. data, err := os.ReadFile(path)
  34. if err == nil {
  35. value := strings.TrimSpace(string(data))
  36. if value != "" {
  37. return value
  38. }
  39. }
  40. }
  41. return fallback
  42. }
  43. func readOSVersion() string {
  44. data, err := os.ReadFile("/etc/os-release")
  45. if err != nil {
  46. return runtime.GOOS
  47. }
  48. for _, line := range strings.Split(string(data), "\n") {
  49. if strings.HasPrefix(line, "PRETTY_NAME=") {
  50. return strings.Trim(strconv.Quote(strings.Trim(strings.TrimPrefix(line, "PRETTY_NAME="), `"`)), `"`)
  51. }
  52. }
  53. return runtime.GOOS
  54. }