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  }