diff options
Diffstat (limited to 'lib/syncthing')
-rw-r--r-- | lib/syncthing/folder-st.go | 213 | ||||
-rw-r--r-- | lib/syncthing/stfolder.go | 14 |
2 files changed, 7 insertions, 220 deletions
diff --git a/lib/syncthing/folder-st.go b/lib/syncthing/folder-st.go deleted file mode 100644 index 74aa4bb..0000000 --- a/lib/syncthing/folder-st.go +++ /dev/null @@ -1,213 +0,0 @@ -package st - -import ( - "fmt" - "os" - "path/filepath" - "strings" - - "github.com/iotbzh/xds-server/lib/folder" - "github.com/iotbzh/xds-server/lib/xdsconfig" - uuid "github.com/satori/go.uuid" - "github.com/syncthing/syncthing/lib/config" -) - -// IFOLDER interface implementation for syncthing - -// STFolder . -type STFolder struct { - globalConfig *xdsconfig.Config - st *SyncThing - fConfig folder.FolderConfig - stfConfig config.FolderConfiguration - eventIDs []int - eventChangeCB *folder.EventCB - eventChangeCBData *folder.EventCBData -} - -// NewFolderST Create a new instance of STFolder -func (s *SyncThing) NewFolderST(gc *xdsconfig.Config) *STFolder { - return &STFolder{ - globalConfig: gc, - st: s, - } -} - -// NewUID Get a UUID -func (f *STFolder) NewUID(suffix string) string { - i := len(f.st.MyID) - if i > 15 { - i = 15 - } - uuid := uuid.NewV1().String()[:14] + f.st.MyID[:i] - if len(suffix) > 0 { - uuid += "_" + suffix - } - return uuid -} - -// Add a new folder -func (f *STFolder) Add(cfg folder.FolderConfig) (*folder.FolderConfig, error) { - - // Sanity check - if cfg.DataCloudSync.SyncThingID == "" { - return nil, fmt.Errorf("device id not set (SyncThingID field)") - } - - // rootPath should not be empty - if cfg.RootPath == "" { - cfg.RootPath = f.globalConfig.FileConf.ShareRootDir - } - - f.fConfig = cfg - - // Update Syncthing folder - // (except if status is ErrorConfig) - // TODO: add cache to avoid multiple requests on startup - if f.fConfig.Status != folder.StatusErrorConfig { - id, err := f.st.FolderChange(f.fConfig) - if err != nil { - return nil, err - } - - f.stfConfig, err = f.st.FolderConfigGet(id) - if err != nil { - f.fConfig.Status = folder.StatusErrorConfig - return nil, err - } - - // Register to events to update folder status - for _, evName := range []string{EventStateChanged, EventFolderPaused} { - evID, err := f.st.Events.Register(evName, f.cbEventState, id, nil) - if err != nil { - return nil, err - } - f.eventIDs = append(f.eventIDs, evID) - } - - f.fConfig.IsInSync = false // will be updated later by events - f.fConfig.Status = folder.StatusEnable - } - - return &f.fConfig, nil -} - -// GetConfig Get public part of folder config -func (f *STFolder) GetConfig() folder.FolderConfig { - return f.fConfig -} - -// GetFullPath returns the full path of a directory (from server POV) -func (f *STFolder) GetFullPath(dir string) string { - if &dir == nil { - dir = "" - } - if filepath.IsAbs(dir) { - return filepath.Join(f.fConfig.RootPath, dir) - } - return filepath.Join(f.fConfig.RootPath, f.fConfig.ClientPath, dir) -} - -// ConvPathCli2Svr Convert path from Client to Server -func (f *STFolder) ConvPathCli2Svr(s string) string { - if f.fConfig.ClientPath != "" && f.fConfig.RootPath != "" { - return strings.Replace(s, - f.fConfig.ClientPath, - f.fConfig.RootPath+"/"+f.fConfig.ClientPath, - -1) - } - return s -} - -// ConvPathSvr2Cli Convert path from Server to Client -func (f *STFolder) ConvPathSvr2Cli(s string) string { - if f.fConfig.ClientPath != "" && f.fConfig.RootPath != "" { - return strings.Replace(s, - f.fConfig.RootPath+"/"+f.fConfig.ClientPath, - f.fConfig.ClientPath, - -1) - } - return s -} - -// Remove a folder -func (f *STFolder) Remove() error { - err := f.st.FolderDelete(f.stfConfig.ID) - - // Delete folder on server side - err2 := os.RemoveAll(f.GetFullPath("")) - - if err != nil { - return err - } - return err2 -} - -// Update update some fields of a folder -func (f *STFolder) Update(cfg folder.FolderConfig) (*folder.FolderConfig, error) { - if f.fConfig.ID != cfg.ID { - return nil, fmt.Errorf("Invalid id") - } - f.fConfig = cfg - return &f.fConfig, nil -} - -// RegisterEventChange requests registration for folder event change -func (f *STFolder) RegisterEventChange(cb *folder.EventCB, data *folder.EventCBData) error { - f.eventChangeCB = cb - f.eventChangeCBData = data - return nil -} - -// UnRegisterEventChange remove registered callback -func (f *STFolder) UnRegisterEventChange() error { - f.eventChangeCB = nil - f.eventChangeCBData = nil - return nil -} - -// Sync Force folder files synchronization -func (f *STFolder) Sync() error { - return f.st.FolderScan(f.stfConfig.ID, "") -} - -// IsInSync Check if folder files are in-sync -func (f *STFolder) IsInSync() (bool, error) { - sts, err := f.st.IsFolderInSync(f.stfConfig.ID) - if err != nil { - return false, err - } - f.fConfig.IsInSync = sts - return sts, nil -} - -// callback use to update IsInSync status -func (f *STFolder) cbEventState(ev Event, data *EventsCBData) { - prevSync := f.fConfig.IsInSync - prevStatus := f.fConfig.Status - - switch ev.Type { - - case EventStateChanged: - to := ev.Data["to"] - switch to { - case "scanning", "syncing": - f.fConfig.Status = folder.StatusSyncing - case "idle": - f.fConfig.Status = folder.StatusEnable - } - f.fConfig.IsInSync = (to == "idle") - - case EventFolderPaused: - if f.fConfig.Status == folder.StatusEnable { - f.fConfig.Status = folder.StatusPause - } - f.fConfig.IsInSync = false - } - - if f.eventChangeCB != nil && - (prevSync != f.fConfig.IsInSync || prevStatus != f.fConfig.Status) { - cpConf := f.fConfig - (*f.eventChangeCB)(&cpConf, f.eventChangeCBData) - } -} diff --git a/lib/syncthing/stfolder.go b/lib/syncthing/stfolder.go index 503ba4b..1a5a7ec 100644 --- a/lib/syncthing/stfolder.go +++ b/lib/syncthing/stfolder.go @@ -6,13 +6,13 @@ import ( "path/filepath" "strings" - "github.com/iotbzh/xds-server/lib/folder" + "github.com/iotbzh/xds-server/lib/xsapiv1" stconfig "github.com/syncthing/syncthing/lib/config" "github.com/syncthing/syncthing/lib/protocol" ) // FolderLoadFromStConfig Load/Retrieve folder config from syncthing database -func (s *SyncThing) FolderLoadFromStConfig(f *[]folder.FolderConfig) error { +func (s *SyncThing) FolderLoadFromStConfig(f *[]xsapiv1.FolderConfig) error { defaultSdk := "" // cannot know which was the default sdk @@ -36,15 +36,15 @@ func (s *SyncThing) FolderLoadFromStConfig(f *[]folder.FolderConfig) error { if cliPath == "" { cliPath = stFld.Path } - *f = append(*f, folder.FolderConfig{ + *f = append(*f, xsapiv1.FolderConfig{ ID: stFld.ID, Label: stFld.Label, ClientPath: strings.TrimRight(cliPath, "/"), - Type: folder.TypeCloudSync, - Status: folder.StatusDisable, + Type: xsapiv1.TypeCloudSync, + Status: xsapiv1.StatusDisable, DefaultSdk: defaultSdk, RootPath: s.conf.FileConf.ShareRootDir, - DataCloudSync: folder.CloudSyncConfig{SyncThingID: devID}, + DataCloudSync: xsapiv1.CloudSyncConfig{SyncThingID: devID}, }) } @@ -52,7 +52,7 @@ func (s *SyncThing) FolderLoadFromStConfig(f *[]folder.FolderConfig) error { } // FolderChange is called when configuration has changed -func (s *SyncThing) FolderChange(f folder.FolderConfig) (string, error) { +func (s *SyncThing) FolderChange(f xsapiv1.FolderConfig) (string, error) { // Get current config stCfg, err := s.ConfigGet() |