Merge remote-tracking branch 'origin/master' into wip
[src/xds/xds-server.git] / lib / xdsconfig / data.go
1 package xdsconfig
2
3 import (
4         "encoding/xml"
5         "fmt"
6         "os"
7
8         common "github.com/iotbzh/xds-common/golib"
9         uuid "github.com/satori/go.uuid"
10         "github.com/syncthing/syncthing/lib/sync"
11 )
12
13 // xmlServerData contains persistent data stored/loaded by server
14 type xmlServerData struct {
15         XMLName xml.Name   `xml:"XDS-Server"`
16         Version string     `xml:"version,attr"`
17         Data    ServerData `xml:"server-data"`
18 }
19
20 type ServerData struct {
21         ID string `xml:"id"`
22 }
23
24 var sdMutex = sync.NewMutex()
25
26 // ServerIDGet
27 func ServerIDGet() (string, error) {
28         var f string
29         var err error
30
31         d := ServerData{}
32         if f, err = ServerDataFilenameGet(); err != nil {
33                 return "", err
34         }
35         if err = serverDataRead(f, &d); err != nil || d.ID == "" {
36                 // Create a new uuid when not found
37                 d.ID = uuid.NewV1().String()
38                 if err := serverDataWrite(f, d); err != nil {
39                         return "", err
40                 }
41         }
42         return d.ID, nil
43 }
44
45 // serverDataRead reads data saved on disk
46 func serverDataRead(file string, data *ServerData) error {
47         if !common.Exists(file) {
48                 return fmt.Errorf("No folder config file found (%s)", file)
49         }
50
51         sdMutex.Lock()
52         defer sdMutex.Unlock()
53
54         fd, err := os.Open(file)
55         defer fd.Close()
56         if err != nil {
57                 return err
58         }
59
60         xsd := xmlServerData{}
61         err = xml.NewDecoder(fd).Decode(&xsd)
62         if err == nil {
63                 *data = xsd.Data
64         }
65         return err
66 }
67
68 // serverDataWrite writes persistant data to disk
69 func serverDataWrite(file string, data ServerData) error {
70         sdMutex.Lock()
71         defer sdMutex.Unlock()
72
73         fd, err := os.OpenFile(file, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
74         defer fd.Close()
75         if err != nil {
76                 return err
77         }
78
79         xsd := &xmlServerData{
80                 Version: "1",
81                 Data:    data,
82         }
83
84         enc := xml.NewEncoder(fd)
85         enc.Indent("", "  ")
86         return enc.Encode(xsd)
87 }