From d3f1eaf1a3d131aadb1877da0bb3b048cc2053e3 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Thu, 19 Mar 2015 11:31:21 +0100 Subject: [PATCH] Add external versioner (ref #573) --- gui/index.html | 15 ++++ .../core/controllers/syncthingController.js | 18 +++- internal/auto/gui.files.go | 4 +- internal/versioner/external.go | 89 +++++++++++++++++++ internal/versioner/simple.go | 11 ++- internal/versioner/staggered.go | 12 +-- 6 files changed, 134 insertions(+), 15 deletions(-) create mode 100644 internal/versioner/external.go diff --git a/gui/index.html b/gui/index.html index d79524f2a..004fcf71b 100644 --- a/gui/index.html +++ b/gui/index.html @@ -237,6 +237,7 @@ Staggered File Versioning Simple File Versioning + External File Versioning @@ -620,6 +621,11 @@ Staggered File Versioning +
+ +

Files are moved to date stamped versions in a .stversions folder when replaced or deleted by syncthing.

@@ -646,6 +652,15 @@

Path where versions should be stored (leave empty for the default .stversions folder in the folder).

+
+

A external command handles the versioning. It has to remove the file from the synced folder.

+ + +

+ The first command line parameter is the folder path and the second parameter is the relative path in the folder. + The path cannot be blank. +

+
diff --git a/gui/scripts/syncthing/core/controllers/syncthingController.js b/gui/scripts/syncthing/core/controllers/syncthingController.js index dfd0470fc..d7a1f1808 100644 --- a/gui/scripts/syncthing/core/controllers/syncthingController.js +++ b/gui/scripts/syncthing/core/controllers/syncthingController.js @@ -904,6 +904,10 @@ angular.module('syncthing.core') $scope.currentFolder.staggeredMaxAge = Math.floor(+$scope.currentFolder.versioning.params.maxAge / 86400); $scope.currentFolder.staggeredCleanInterval = +$scope.currentFolder.versioning.params.cleanInterval; $scope.currentFolder.staggeredVersionsPath = $scope.currentFolder.versioning.params.versionsPath; + } else if ($scope.currentFolder.versioning && $scope.currentFolder.versioning.type === "external") { + $scope.currentFolder.externalFileVersioning = true; + $scope.currentFolder.fileVersioningSelector = "external"; + $scope.currentFolder.externalCommand = $scope.currentFolder.versioning.params.command; } else { $scope.currentFolder.fileVersioningSelector = "none"; } @@ -917,7 +921,8 @@ angular.module('syncthing.core') if (typeof $scope.currentFolder.staggeredMaxAge === 'undefined') { $scope.currentFolder.staggeredMaxAge = 365; } - + $scope.currentFolder.externalCommand = $scope.currentFolder.externalCommand || ""; + $scope.editingExisting = true; $scope.folderEditor.$setPristine(); $('#editFolder').modal(); @@ -933,6 +938,7 @@ angular.module('syncthing.core') $scope.currentFolder.staggeredMaxAge = 365; $scope.currentFolder.staggeredCleanInterval = 3600; $scope.currentFolder.staggeredVersionsPath = ""; + $scope.currentFolder.externalCommand = ""; $scope.editingExisting = false; $scope.folderEditor.$setPristine(); $('#editFolder').modal(); @@ -952,6 +958,7 @@ angular.module('syncthing.core') $scope.currentFolder.staggeredMaxAge = 365; $scope.currentFolder.staggeredCleanInterval = 3600; $scope.currentFolder.staggeredVersionsPath = ""; + $scope.currentFolder.externalCommand = ""; $scope.editingExisting = false; $scope.folderEditor.$setPristine(); $('#editFolder').modal(); @@ -1005,6 +1012,15 @@ angular.module('syncthing.core') delete folderCfg.staggeredCleanInterval; delete folderCfg.staggeredVersionsPath; + } else if (folderCfg.fileVersioningSelector === "external") { + folderCfg.versioning = { + 'Type': 'external', + 'Params': { + 'command': '' + folderCfg.externalCommand + } + }; + delete folderCfg.externalFileVersioning; + delete folderCfg.externalCommand; } else { delete folderCfg.versioning; } diff --git a/internal/auto/gui.files.go b/internal/auto/gui.files.go index 35a7ee0bf..72f3cffbf 100644 --- a/internal/auto/gui.files.go +++ b/internal/auto/gui.files.go @@ -172,7 +172,7 @@ func Assets() map[string][]byte { bs, _ = ioutil.ReadAll(gr) assets["assets/lang/valid-langs.js"] = bs - bs, _ = base64.StdEncoding.DecodeString("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") + bs, _ = base64.StdEncoding.DecodeString("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") gr, _ = gzip.NewReader(bytes.NewReader(bs)) bs, _ = ioutil.ReadAll(gr) assets["index.html"] = bs @@ -192,7 +192,7 @@ func Assets() map[string][]byte { bs, _ = ioutil.ReadAll(gr) assets["scripts/syncthing/core/controllers/eventController.js"] = bs - bs, _ = base64.StdEncoding.DecodeString("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") + bs, _ = base64.StdEncoding.DecodeString("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") gr, _ = gzip.NewReader(bytes.NewReader(bs)) bs, _ = ioutil.ReadAll(gr) assets["scripts/syncthing/core/controllers/syncthingController.js"] = bs diff --git a/internal/versioner/external.go b/internal/versioner/external.go new file mode 100644 index 000000000..343862107 --- /dev/null +++ b/internal/versioner/external.go @@ -0,0 +1,89 @@ +// Copyright (C) 2015 The Syncthing Authors. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package versioner + +import ( + "errors" + "os" + "os/exec" + "path/filepath" + "strings" +) + +func init() { + // Register the constructor for this type of versioner with the name "external" + Factories["external"] = NewExternal +} + +// The type holds our configuration +type External struct { + command string + folderPath string +} + +// The constructor function takes a map of parameters and creates the type. +func NewExternal(folderID, folderPath string, params map[string]string) Versioner { + command := params["command"] + + s := External{ + command: command, + folderPath: folderPath, + } + + if debug { + l.Debugf("instantiated %#v", s) + } + return s +} + +// Move away the named file to a version archive. If this function returns +// nil, the named file does not exist any more (has been archived). +func (v External) Archive(filePath string) error { + _, err := os.Lstat(filePath) + if os.IsNotExist(err) { + if debug { + l.Debugln("not archiving nonexistent file", filePath) + } + return nil + } else if err != nil { + return err + } + + if debug { + l.Debugln("archiving", filePath) + } + + inFolderPath, err := filepath.Rel(v.folderPath, filePath) + if err != nil { + return err + } + + if v.command == "" { + return errors.New("Versioner: command is empty, please enter a valid command") + } + + cmd := exec.Command(v.command, v.folderPath, inFolderPath) + env := os.Environ() + // filter STGUIAUTH and STGUIAPIKEY from environment variables + filteredEnv := []string{} + for _, x := range env { + if !strings.HasPrefix(x, "STGUIAUTH=") && !strings.HasPrefix(x, "STGUIAPIKEY=") { + filteredEnv = append(filteredEnv, x) + } + } + cmd.Env = filteredEnv + err = cmd.Run() + if err != nil { + return err + } + + // return error if the file was not removed + if _, err = os.Lstat(filePath); os.IsNotExist(err) { + return nil + } + return errors.New("Versioner: file was not removed by external script") +} diff --git a/internal/versioner/simple.go b/internal/versioner/simple.go index 30da9b93b..f621fef3b 100644 --- a/internal/versioner/simple.go +++ b/internal/versioner/simple.go @@ -47,13 +47,12 @@ func NewSimple(folderID, folderPath string, params map[string]string) Versioner // nil, the named file does not exist any more (has been archived). func (v Simple) Archive(filePath string) error { fileInfo, err := os.Lstat(filePath) - if err != nil { - if os.IsNotExist(err) { - if debug { - l.Debugln("not archiving nonexistent file", filePath) - } - return nil + if os.IsNotExist(err) { + if debug { + l.Debugln("not archiving nonexistent file", filePath) } + return nil + } else if err != nil { return err } diff --git a/internal/versioner/staggered.go b/internal/versioner/staggered.go index 2c154ca48..ae582f0a8 100644 --- a/internal/versioner/staggered.go +++ b/internal/versioner/staggered.go @@ -281,13 +281,13 @@ func (v Staggered) Archive(filePath string) error { v.mutex.Lock() defer v.mutex.Unlock() - if _, err := os.Lstat(filePath); err != nil { - if os.IsNotExist(err) { - if debug { - l.Debugln("not archiving nonexistent file", filePath) - } - return nil + _, err := os.Lstat(filePath) + if os.IsNotExist(err) { + if debug { + l.Debugln("not archiving nonexistent file", filePath) } + return nil + } else if err != nil { return err }