Allow to set Syncthing rescanInterval parameter.
[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         if s.conf.FileConf.SThgConf.RescanIntervalS > 0 {
62                 folder.RescanIntervalS = s.conf.FileConf.SThgConf.RescanIntervalS
63         }
64
65         folder.Devices = append(folder.Devices, config.FolderDeviceConfiguration{
66                 DeviceID: newDevice.DeviceID,
67         })
68
69         found = false
70         var fld config.FolderConfiguration
71         for _, fld = range stCfg.Folders {
72                 if folder.ID == fld.ID {
73                         fld = folder
74                         found = true
75                         break
76                 }
77         }
78         if !found {
79                 stCfg.Folders = append(stCfg.Folders, folder)
80                 fld = stCfg.Folders[0]
81         }
82
83         err = s.ConfigSet(stCfg)
84         if err != nil {
85                 s.log.Errorln(err)
86         }
87
88         return nil
89 }
90
91 // FolderDelete is called to delete a folder config
92 func (s *SyncThing) FolderDelete(id string) error {
93         // Get current config
94         stCfg, err := s.ConfigGet()
95         if err != nil {
96                 s.log.Errorln(err)
97                 return err
98         }
99
100         for i, fld := range stCfg.Folders {
101                 if id == fld.ID {
102                         stCfg.Folders = append(stCfg.Folders[:i], stCfg.Folders[i+1:]...)
103                         err = s.ConfigSet(stCfg)
104                         if err != nil {
105                                 s.log.Errorln(err)
106                                 return err
107                         }
108                 }
109         }
110
111         return nil
112 }