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