8 common "github.com/iotbzh/xds-common/golib"
9 "github.com/iotbzh/xds-server/lib/folder"
10 stconfig "github.com/syncthing/syncthing/lib/config"
11 "github.com/syncthing/syncthing/lib/protocol"
14 // FIXME remove and use an interface on xdsconfig.FolderConfig
15 type FolderChangeArg struct {
23 // FolderLoadFromStConfig Load/Retrieve folder config from syncthing database
24 func (s *SyncThing) FolderLoadFromStConfig(f *[]folder.FolderConfig) error {
26 defaultSdk := "" // cannot know which was the default sdk
28 stCfg, err := s.ConfigGet()
32 if len(stCfg.Devices) < 1 {
33 return fmt.Errorf("Cannot load syncthing config: no device defined")
35 devID := stCfg.Devices[0].DeviceID.String()
37 if len(stCfg.Devices) < 2 {
38 return fmt.Errorf("Cannot load syncthing config: no valid device found")
40 devID = stCfg.Devices[1].DeviceID.String()
43 for _, stFld := range stCfg.Folders {
45 cliPath := strings.TrimPrefix(stFld.Path, s.conf.FileConf.ShareRootDir)
50 *f = append(*f, folder.FolderConfig{
53 ClientPath: strings.TrimRight(cliPath, "/"),
54 Type: folder.TypeCloudSync,
55 Status: folder.StatusDisable,
56 DefaultSdk: defaultSdk,
57 RootPath: "", //s.conf.FileConf.ShareRootDir,
58 DataCloudSync: folder.CloudSyncConfig{SyncThingID: devID},
65 // FolderChange is called when configuration has changed
66 func (s *SyncThing) FolderChange(f FolderChangeArg) (string, error) {
69 stCfg, err := s.ConfigGet()
75 stClientID := f.SyncThingID
76 // Add new Device if needed
77 var devID protocol.DeviceID
78 if err := devID.UnmarshalText([]byte(stClientID)); err != nil {
79 s.log.Errorf("not a valid device id (err %v)", err)
83 newDevice := stconfig.DeviceConfiguration{
86 Addresses: []string{"dynamic"},
90 for _, device := range stCfg.Devices {
91 if device.DeviceID == devID {
97 stCfg.Devices = append(stCfg.Devices, newDevice)
100 // Add or update Folder settings
102 if label = f.Label; label == "" {
103 label = strings.Split(id, "/")[0]
105 if id = f.ID; id == "" {
106 id = stClientID[0:15] + "_" + label
109 // Resolve local path
110 pathCli, err := common.ResolveEnvVar(f.RelativePath)
112 pathCli = f.RelativePath
114 // SEB still need ShareRootDir ? a sup
115 // pathCli := filepath.Join(f.ShareRootDir, f.RelativePath)
117 folder := stconfig.FolderConfiguration{
125 if s.conf.FileConf.SThgConf.RescanIntervalS > 0 {
126 folder.RescanIntervalS = s.conf.FileConf.SThgConf.RescanIntervalS
130 folder.Devices = append(folder.Devices, stconfig.FolderDeviceConfiguration{
131 DeviceID: newDevice.DeviceID,
135 var fld stconfig.FolderConfiguration
136 for _, fld = range stCfg.Folders {
137 if folder.ID == fld.ID {
144 stCfg.Folders = append(stCfg.Folders, folder)
145 fld = stCfg.Folders[0]
148 err = s.ConfigSet(stCfg)
156 // FolderDelete is called to delete a folder config
157 func (s *SyncThing) FolderDelete(id string) error {
158 // Get current config
159 stCfg, err := s.ConfigGet()
165 for i, fld := range stCfg.Folders {
167 stCfg.Folders = append(stCfg.Folders[:i], stCfg.Folders[i+1:]...)
168 err = s.ConfigSet(stCfg)
179 // FolderConfigGet Returns the configuration of a specific folder
180 func (s *SyncThing) FolderConfigGet(folderID string) (stconfig.FolderConfiguration, error) {
181 fc := stconfig.FolderConfiguration{}
183 return fc, fmt.Errorf("folderID not set")
185 cfg, err := s.ConfigGet()
189 for _, f := range cfg.Folders {
190 if f.ID == folderID {
195 return fc, fmt.Errorf("id not found")
198 // FolderStatus Returns all information about the current
199 func (s *SyncThing) FolderStatus(folderID string) (*FolderStatus, error) {
203 return nil, fmt.Errorf("folderID not set")
205 if err := s.client.HTTPGet("db/status?folder="+folderID, &data); err != nil {
208 if err := json.Unmarshal(data, &res); err != nil {
214 // IsFolderInSync Returns true when folder is in sync
215 func (s *SyncThing) IsFolderInSync(folderID string) (bool, error) {
216 sts, err := s.FolderStatus(folderID)
220 return sts.NeedBytes == 0 && sts.State == "idle", nil
223 // FolderScan Request immediate folder scan.
224 // Scan all folders if folderID param is empty
225 func (s *SyncThing) FolderScan(folderID string, subpath string) error {
228 url += "?folder=" + folderID
231 url += "&sub=" + subpath
234 return s.client.HTTPPost(url, "")