metadata.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package network
  2. import (
  3. "encoding/json"
  4. "os"
  5. "path/filepath"
  6. "sync"
  7. )
  8. var defaultMetadataPath = "/etc/proxmox-router/metadata.json"
  9. // MetadataManager manages user annotations for interfaces.
  10. type MetadataManager struct {
  11. mu sync.RWMutex
  12. filePath string
  13. store MetadataStore
  14. }
  15. func NewMetadataManager(customPath string) *MetadataManager {
  16. p := defaultMetadataPath
  17. if customPath != "" {
  18. p = customPath
  19. }
  20. mm := &MetadataManager{
  21. filePath: p,
  22. store: MetadataStore{
  23. Interfaces: make(map[string]InterfaceMetadata),
  24. },
  25. }
  26. mm.load()
  27. return mm
  28. }
  29. func (mm *MetadataManager) load() {
  30. mm.mu.Lock()
  31. defer mm.mu.Unlock()
  32. data, err := os.ReadFile(mm.filePath)
  33. if err != nil {
  34. return
  35. }
  36. _ = json.Unmarshal(data, &mm.store)
  37. if mm.store.Interfaces == nil {
  38. mm.store.Interfaces = make(map[string]InterfaceMetadata)
  39. }
  40. }
  41. func (mm *MetadataManager) save() error {
  42. dir := filepath.Dir(mm.filePath)
  43. if err := os.MkdirAll(dir, 0755); err != nil {
  44. return err
  45. }
  46. data, err := json.MarshalIndent(mm.store, "", " ")
  47. if err != nil {
  48. return err
  49. }
  50. return os.WriteFile(mm.filePath, data, 0644)
  51. }
  52. func (mm *MetadataManager) Get(name string) InterfaceMetadata {
  53. mm.mu.RLock()
  54. defer mm.mu.RUnlock()
  55. return mm.store.Interfaces[name]
  56. }
  57. func (mm *MetadataManager) Set(name string, role, desc string) error {
  58. mm.mu.Lock()
  59. defer mm.mu.Unlock()
  60. mm.store.Interfaces[name] = InterfaceMetadata{
  61. Role: role,
  62. Description: desc,
  63. }
  64. return mm.save()
  65. }
  66. func (mm *MetadataManager) Delete(name string) error {
  67. mm.mu.Lock()
  68. defer mm.mu.Unlock()
  69. delete(mm.store.Interfaces, name)
  70. return mm.save()
  71. }