Add Cross SDKs support (part 2)
[src/xds/xds-server.git] / lib / syncthing / stfolder.go
1 package st
2
3 import (
4         "path/filepath"
5         "strings"
6
7         "github.com/iotbzh/xds-server/lib/xdsconfig"
8         "github.com/syncthing/syncthing/lib/config"
9         "github.com/syncthing/syncthing/lib/protocol"
10 )
11
12 // FolderChange is called when configuration has changed
13 func (s *SyncThing) FolderChange(f xdsconfig.FolderConfig) error {
14
15         // Get current config
16         stCfg, err := s.ConfigGet()
17         if err != nil {
18                 s.log.Errorln(err)
19                 return err
20         }
21
22         // Add new Device if needed
23         var devID protocol.DeviceID
24         if err := devID.UnmarshalText([]byte(f.SyncThingID)); err != nil {
25                 s.log.Errorf("not a valid device id (err %v)\n", err)
26                 return err
27         }
28
29         newDevice := config.DeviceConfiguration{
30                 DeviceID:  devID,
31                 Name:      f.SyncThingID,
32                 Addresses: []string{"dynamic"},
33         }
34
35         var found = false
36         for _, device := range stCfg.Devices {
37                 if device.DeviceID == devID {
38                         found = true
39                         break
40                 }
41         }
42         if !found {
43                 stCfg.Devices = append(stCfg.Devices, newDevice)
44         }
45
46         // Add or update Folder settings
47         var label, id string
48         if label = f.Label; label == "" {
49                 label = strings.Split(id, "/")[0]
50         }
51         if id = f.ID; id == "" {
52                 id = f.SyncThingID[0:15] + "_" + label
53         }
54
55         folder := config.FolderConfiguration{
56                 ID:      id,
57                 Label:   label,
58                 RawPath: filepath.Join(s.conf.ShareRootDir, f.RelativePath),
59         }
60
61         folder.Devices = append(folder.Devices, config.FolderDeviceConfiguration{
62                 DeviceID: newDevice.DeviceID,
63         })
64
65         found = false
66         var fld config.FolderConfiguration
67         for _, fld = range stCfg.Folders {
68                 if folder.ID == fld.ID {
69                         fld = folder
70                         found = true
71                         break
72                 }
73         }
74         if !found {
75                 stCfg.Folders = append(stCfg.Folders, folder)
76                 fld = stCfg.Folders[0]
77         }
78
79         err = s.ConfigSet(stCfg)
80         if err != nil {
81                 s.log.Errorln(err)
82         }
83
84         return nil
85 }
86
87 // FolderDelete is called to delete a folder config
88 func (s *SyncThing) FolderDelete(id string) error {
89         // Get current config
90         stCfg, err := s.ConfigGet()
91         if err != nil {
92                 s.log.Errorln(err)
93                 return err
94         }
95
96         for i, fld := range stCfg.Folders {
97                 if id == fld.ID {
98                         stCfg.Folders = append(stCfg.Folders[:i], stCfg.Folders[i+1:]...)
99                         err = s.ConfigSet(stCfg)
100                         if err != nil {
101                                 s.log.Errorln(err)
102                                 return err
103                         }
104                 }
105         }
106
107         return nil
108 }