storage.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package storage
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "log"
  6. "network-topology-discovery/pkg/models"
  7. "os"
  8. "sync"
  9. "time"
  10. )
  11. // Storage 存储(使用JSON文件)
  12. type Storage struct {
  13. mu sync.RWMutex
  14. filePath string
  15. devices map[string]models.Device
  16. }
  17. // NewStorage 创建存储实例(兼容旧版,使用默认文件)
  18. func NewStorage(filePath string) (*Storage, error) {
  19. return NewStorageForTopology(filePath)
  20. }
  21. // NewStorageForTopology 为特定拓扑创建存储实例
  22. func NewStorageForTopology(filePath string) (*Storage, error) {
  23. s := &Storage{
  24. filePath: filePath,
  25. devices: make(map[string]models.Device),
  26. }
  27. // 从文件加载数据
  28. if err := s.load(); err != nil {
  29. if !os.IsNotExist(err) {
  30. return nil, fmt.Errorf("failed to load storage: %w", err)
  31. }
  32. // 文件不存在是正常的,创建新文件
  33. log.Printf("Creating new storage file: %s", filePath)
  34. }
  35. return s, nil
  36. }
  37. // SetFilePath 切换存储文件路径(用于切换拓扑)
  38. func (s *Storage) SetFilePath(filePath string) error {
  39. s.mu.Lock()
  40. s.filePath = filePath
  41. s.devices = make(map[string]models.Device)
  42. s.mu.Unlock()
  43. // 重新加载数据
  44. if err := s.load(); err != nil {
  45. if !os.IsNotExist(err) {
  46. return fmt.Errorf("failed to load storage: %w", err)
  47. }
  48. }
  49. log.Printf("Storage switched to: %s", filePath)
  50. return nil
  51. }
  52. // load 从文件加载数据
  53. func (s *Storage) load() error {
  54. data, err := os.ReadFile(s.filePath)
  55. if err != nil {
  56. return err
  57. }
  58. var devices []models.Device
  59. if err := json.Unmarshal(data, &devices); err != nil {
  60. return fmt.Errorf("failed to parse storage file: %w", err)
  61. }
  62. for _, dev := range devices {
  63. s.devices[dev.ID] = dev
  64. }
  65. log.Printf("Loaded %d devices from storage", len(devices))
  66. return nil
  67. }
  68. // save 保存数据到文件
  69. func (s *Storage) save() error {
  70. devices := make([]models.Device, 0, len(s.devices))
  71. for _, dev := range s.devices {
  72. devices = append(devices, dev)
  73. }
  74. data, err := json.MarshalIndent(devices, "", " ")
  75. if err != nil {
  76. return fmt.Errorf("failed to marshal devices: %w", err)
  77. }
  78. if err := os.WriteFile(s.filePath, data, 0644); err != nil {
  79. return fmt.Errorf("failed to write storage file: %w", err)
  80. }
  81. return nil
  82. }
  83. // SaveDevice 保存设备
  84. func (s *Storage) SaveDevice(device *models.Device) error {
  85. s.mu.Lock()
  86. defer s.mu.Unlock()
  87. // 设置ID和扫描时间
  88. if device.ID == "" {
  89. device.ID = device.IP
  90. }
  91. device.LastScanned = time.Now()
  92. s.devices[device.ID] = *device
  93. // 保存到文件
  94. if err := s.save(); err != nil {
  95. return fmt.Errorf("failed to save device: %w", err)
  96. }
  97. log.Printf("Device saved: %s (%s)", device.IP, device.Hostname)
  98. return nil
  99. }
  100. // GetDevice 获取设备
  101. func (s *Storage) GetDevice(id string) (*models.Device, error) {
  102. s.mu.RLock()
  103. defer s.mu.RUnlock()
  104. device, exists := s.devices[id]
  105. if !exists {
  106. return nil, fmt.Errorf("device not found: %s", id)
  107. }
  108. return &device, nil
  109. }
  110. // GetAllDevices 获取所有设备
  111. func (s *Storage) GetAllDevices() ([]models.Device, error) {
  112. s.mu.RLock()
  113. defer s.mu.RUnlock()
  114. devices := make([]models.Device, 0, len(s.devices))
  115. for _, dev := range s.devices {
  116. devices = append(devices, dev)
  117. }
  118. return devices, nil
  119. }
  120. // DeleteDevice 删除设备
  121. func (s *Storage) DeleteDevice(id string) error {
  122. s.mu.Lock()
  123. defer s.mu.Unlock()
  124. delete(s.devices, id)
  125. // 保存到文件
  126. if err := s.save(); err != nil {
  127. return fmt.Errorf("failed to delete device: %w", err)
  128. }
  129. return nil
  130. }
  131. // Close 关闭存储(不需要操作,JSON文件不需要关闭)
  132. func (s *Storage) Close() error {
  133. return nil
  134. }