github.com/stampzilla/stampzilla-go@v2.0.0-rc9+incompatible/nodes/stampzilla-server/store/nodes.go (about) 1 package store 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "io/ioutil" 7 "os" 8 "path/filepath" 9 10 "github.com/sirupsen/logrus" 11 "github.com/stampzilla/stampzilla-go/nodes/stampzilla-server/models" 12 ) 13 14 func (store *Store) GetNodes() Nodes { 15 store.RLock() 16 defer store.RUnlock() 17 return store.Nodes 18 } 19 20 func (store *Store) GetNode(uuid string) *models.Node { 21 store.RLock() 22 defer store.RUnlock() 23 n, _ := store.Nodes[uuid] 24 return n 25 } 26 27 func (store *Store) AddOrUpdateNode(node *models.Node) { 28 store.Lock() 29 30 if _, ok := store.Nodes[node.UUID]; !ok { 31 store.Nodes[node.UUID] = node 32 } else { 33 34 if node.Version != "" { 35 store.Nodes[node.UUID].Version = node.Version 36 } 37 if node.Type != "" { 38 store.Nodes[node.UUID].Type = node.Type 39 } 40 if node.Name != "" { 41 store.Nodes[node.UUID].Name = node.Name 42 } 43 if node.Config != nil { 44 logrus.Info("Setting config to: ", string(node.Config)) 45 store.Nodes[node.UUID].Config = node.Config 46 } 47 48 } 49 50 store.Unlock() 51 52 store.runCallbacks("nodes") 53 } 54 func (store *Store) SaveNodes() error { 55 nodes := store.GetNodes() 56 57 for _, node := range nodes { 58 err := saveConfigToFile(node) 59 if err != nil { 60 return err 61 } 62 } 63 return nil 64 } 65 66 func (store *Store) LoadNodes() error { 67 path := "configs" 68 69 if _, err := os.Stat(path); os.IsNotExist(err) { 70 return nil 71 } 72 files, err := ioutil.ReadDir(path) 73 if err != nil { 74 return err 75 } 76 77 for _, f := range files { 78 if f.Name()[0] == '.' { 79 continue 80 } 81 82 node, err := loadNodeConfigFromFile(filepath.Join(path, f.Name())) 83 if err != nil { 84 return err 85 } 86 store.AddOrUpdateNode(node) 87 } 88 return nil 89 } 90 func loadNodeConfigFromFile(file string) (*models.Node, error) { 91 f, err := os.Open(file) 92 if err != nil { 93 return nil, err 94 } 95 defer f.Close() 96 97 var node *models.Node 98 99 decoder := json.NewDecoder(f) 100 err = decoder.Decode(&node) 101 102 return node, err 103 } 104 105 func saveConfigToFile(node *models.Node) error { 106 path := "configs/" 107 if _, err := os.Stat(path); os.IsNotExist(err) { 108 os.MkdirAll(path, 0755) 109 } 110 111 configFile, err := os.Create(path + node.UUID + ".json") 112 if err != nil { 113 return err 114 } 115 116 var out bytes.Buffer 117 b, err := json.MarshalIndent(node, "", "\t") 118 if err != nil { 119 return err 120 } 121 json.Indent(&out, b, "", "\t") 122 _, err = out.WriteTo(configFile) 123 return err 124 }