8 common "github.com/iotbzh/xds-common/golib"
9 stconfig "github.com/syncthing/syncthing/lib/config"
10 "github.com/syncthing/syncthing/lib/protocol"
13 // FolderChangeArg argument structure used by FolderChange
14 type FolderChangeArg struct {
21 // FolderLoadFromStConfig Load/Retrieve folder config from syncthing database
23 func (s *SyncThing) FolderLoadFromStConfig(f *[]xsapiv1.FolderConfig) error {
25 defaultSdk := "" // cannot know which was the default sdk
27 stCfg, err := s.ConfigGet()
31 if len(stCfg.Devices) < 1 {
32 return fmt.Errorf("Cannot load syncthing config: no device defined")
34 devID := stCfg.Devices[0].DeviceID.String()
36 if len(stCfg.Devices) < 2 {
37 return fmt.Errorf("Cannot load syncthing config: no valid device found")
39 devID = stCfg.Devices[1].DeviceID.String()
42 for _, stFld := range stCfg.Folders {
43 *f = append(*f, xsapiv1.FolderConfig{
46 ClientPath: strings.TrimRight(stFld.Path, "/"),
47 Type: xsapiv1.TypeCloudSync,
48 Status: StatusDisable,
49 DefaultSdk: defaultSdk,
51 DataCloudSync: xsapiv1.CloudSyncConfig{SyncThingID: devID},
59 // FolderChange is called when configuration has changed
60 func (s *SyncThing) FolderChange(f FolderChangeArg) (string, error) {
63 stCfg, err := s.ConfigGet()
69 stClientID := f.SyncThingID
70 // Add new Device if needed
71 var devID protocol.DeviceID
72 if err := devID.UnmarshalText([]byte(stClientID)); err != nil {
73 s.log.Errorf("not a valid device id (err %v)", err)
77 newDevice := stconfig.DeviceConfiguration{
80 Addresses: []string{"dynamic"},
84 for _, device := range stCfg.Devices {
85 if device.DeviceID == devID {
91 stCfg.Devices = append(stCfg.Devices, newDevice)
94 // Add or update Folder settings
96 if label = f.Label; label == "" {
97 label = strings.Split(id, "/")[0]
99 if id = f.ID; id == "" {
100 id = stClientID[0:15] + "_" + label
103 // Resolve local path
104 pathCli, err := common.ResolveEnvVar(f.RelativePath)
106 pathCli = f.RelativePath
109 folder := stconfig.FolderConfiguration{
117 if s.conf.FileConf.SThgConf.RescanIntervalS > 0 {
118 folder.RescanIntervalS = s.conf.FileConf.SThgConf.RescanIntervalS
122 folder.Devices = append(folder.Devices, stconfig.FolderDeviceConfiguration{
123 DeviceID: newDevice.DeviceID,
127 var fld stconfig.FolderConfiguration
128 for _, fld = range stCfg.Folders {
129 if folder.ID == fld.ID {
136 stCfg.Folders = append(stCfg.Folders, folder)
137 fld = stCfg.Folders[0]
140 err = s.ConfigSet(stCfg)
145 // FolderDelete is called to delete a folder config
146 func (s *SyncThing) FolderDelete(id string) error {
147 // Get current config
148 stCfg, err := s.ConfigGet()
154 for i, fld := range stCfg.Folders {
156 stCfg.Folders = append(stCfg.Folders[:i], stCfg.Folders[i+1:]...)
157 err = s.ConfigSet(stCfg)
168 // FolderConfigGet Returns the configuration of a specific folder
169 func (s *SyncThing) FolderConfigGet(folderID string) (stconfig.FolderConfiguration, error) {
170 fc := stconfig.FolderConfiguration{}
172 return fc, fmt.Errorf("folderID not set")
174 cfg, err := s.ConfigGet()
178 for _, f := range cfg.Folders {
179 if f.ID == folderID {
184 return fc, fmt.Errorf("id not found")
187 // FolderStatus Returns all information about the current
188 func (s *SyncThing) FolderStatus(folderID string) (*FolderStatus, error) {
192 return nil, fmt.Errorf("folderID not set")
194 if err := s.client.HTTPGet("db/status?folder="+folderID, &data); err != nil {
197 if err := json.Unmarshal(data, &res); err != nil {
203 // IsFolderInSync Returns true when folder is in sync
204 func (s *SyncThing) IsFolderInSync(folderID string) (bool, error) {
205 sts, err := s.FolderStatus(folderID)
209 return sts.NeedBytes == 0 && sts.State == "idle", nil
212 // FolderScan Request immediate folder scan.
213 // Scan all folders if folderID param is empty
214 func (s *SyncThing) FolderScan(folderID string, subpath string) error {
217 url += "?folder=" + folderID
220 url += "&sub=" + subpath
223 return s.client.HTTPPost(url, "")