diff --git a/cmd/syncthing/gui.go b/cmd/syncthing/gui.go
index 5f48c945..6ee627d4 100644
--- a/cmd/syncthing/gui.go
+++ b/cmd/syncthing/gui.go
@@ -129,6 +129,7 @@ func startGUI(cfg config.GUIConfiguration, assetDir string, m *model.Model) erro
getRestMux.HandleFunc("/rest/upgrade", restGetUpgrade)
getRestMux.HandleFunc("/rest/version", restGetVersion)
getRestMux.HandleFunc("/rest/stats/device", withModel(m, restGetDeviceStats))
+ getRestMux.HandleFunc("/rest/stats/folder", withModel(m, restGetFolderStats))
// Debug endpoints, not for general use
getRestMux.HandleFunc("/rest/debug/peerCompletion", withModel(m, restGetPeerCompletion))
@@ -343,6 +344,12 @@ func restGetDeviceStats(m *model.Model, w http.ResponseWriter, r *http.Request)
json.NewEncoder(w).Encode(res)
}
+func restGetFolderStats(m *model.Model, w http.ResponseWriter, r *http.Request) {
+ var res = m.FolderStatistics()
+ w.Header().Set("Content-Type", "application/json; charset=utf-8")
+ json.NewEncoder(w).Encode(res)
+}
+
func restGetConfig(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
json.NewEncoder(w).Encode(cfg.Raw())
diff --git a/gui/index.html b/gui/index.html
index 64848c7a..9a4977c8 100644
--- a/gui/index.html
+++ b/gui/index.html
@@ -153,6 +153,14 @@
Shared With |
{{sharesFolder(folder)}} |
+
+ | Last change received |
+
+
+ {{folderStats[folder.ID].LastFile.Filename | basename}}
+
+ |
+
@@ -276,8 +284,8 @@
| Last seen |
- Never |
- {{stats[deviceCfg.DeviceID].LastSeen | date:"yyyy-MM-dd HH:mm"}} |
+ Never |
+ {{deviceStats[deviceCfg.DeviceID].LastSeen | date:"yyyy-MM-dd HH:mm"}} |
| Folders |
diff --git a/gui/scripts/syncthing/core/controllers/syncthingController.js b/gui/scripts/syncthing/core/controllers/syncthingController.js
index 4f08d932..c11d72de 100644
--- a/gui/scripts/syncthing/core/controllers/syncthingController.js
+++ b/gui/scripts/syncthing/core/controllers/syncthingController.js
@@ -17,6 +17,7 @@ angular.module('syncthing.core')
refreshConfig();
refreshConnectionStats();
refreshDeviceStats();
+ refreshFolderStats();
$http.get(urlbase + '/version').success(function (data) {
$scope.version = data.version;
@@ -52,7 +53,8 @@ angular.module('syncthing.core')
$scope.folders = {};
$scope.seenError = '';
$scope.upgradeInfo = null;
- $scope.stats = {};
+ $scope.deviceStats = {};
+ $scope.folderStats = {};
$scope.progress = {};
$(window).bind('beforeunload', function () {
@@ -112,6 +114,7 @@ angular.module('syncthing.core')
$scope.$on('LocalIndexUpdated', function (event, arg) {
var data = arg.data;
refreshFolder(data.folder);
+ refreshFolderStats();
// Update completion status for all devices that we share this folder with.
$scope.folders[data.folder].Devices.forEach(function (deviceCfg) {
@@ -364,15 +367,27 @@ angular.module('syncthing.core')
var refreshDeviceStats = debounce(function () {
$http.get(urlbase + "/stats/device").success(function (data) {
- $scope.stats = data;
- for (var device in $scope.stats) {
- $scope.stats[device].LastSeen = new Date($scope.stats[device].LastSeen);
- $scope.stats[device].LastSeenDays = (new Date() - $scope.stats[device].LastSeen) / 1000 / 86400;
+ $scope.deviceStats = data;
+ for (var device in $scope.deviceStats) {
+ $scope.deviceStats[device].LastSeen = new Date($scope.deviceStats[device].LastSeen);
+ $scope.deviceStats[device].LastSeenDays = (new Date() - $scope.deviceStats[device].LastSeen) / 1000 / 86400;
}
console.log("refreshDeviceStats", data);
});
}, 500);
+ var refreshFolderStats = debounce(function () {
+ $http.get(urlbase + "/stats/folder").success(function (data) {
+ $scope.folderStats = data;
+ for (var folder in $scope.folderStats) {
+ if ($scope.folderStats[folder].LastFile) {
+ $scope.folderStats[folder].LastFile.At = new Date($scope.folderStats[folder].LastFile.At);
+ }
+ }
+ console.log("refreshfolderStats", data);
+ });
+ }, 500);
+
$scope.refresh = function () {
refreshSystem();
refreshConnectionStats();
diff --git a/internal/auto/gui.files.go b/internal/auto/gui.files.go
index dda4e108..b338bf0a 100644
--- a/internal/auto/gui.files.go
+++ b/internal/auto/gui.files.go
@@ -142,7 +142,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.NewBuffer(bs))
bs, _ = ioutil.ReadAll(gr)
assets["index.html"] = bs
@@ -162,7 +162,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.NewBuffer(bs))
bs, _ = ioutil.ReadAll(gr)
assets["scripts/syncthing/core/controllers/syncthingController.js"] = bs
diff --git a/internal/model/model.go b/internal/model/model.go
index d6b58942..ba6e7689 100644
--- a/internal/model/model.go
+++ b/internal/model/model.go
@@ -98,6 +98,7 @@ type Model struct {
deviceStatRefs map[protocol.DeviceID]*stats.DeviceStatisticsReference // deviceID -> statsRef
folderIgnores map[string]*ignore.Matcher // folder -> matcher object
folderRunners map[string]service // folder -> puller or scanner
+ folderStatRefs map[string]*stats.FolderStatisticsReference // folder -> statsRef
fmut sync.RWMutex // protects the above
folderState map[string]folderState // folder -> state
@@ -137,6 +138,7 @@ func NewModel(cfg *config.Wrapper, deviceName, clientName, clientVersion string,
deviceStatRefs: make(map[protocol.DeviceID]*stats.DeviceStatisticsReference),
folderIgnores: make(map[string]*ignore.Matcher),
folderRunners: make(map[string]service),
+ folderStatRefs: make(map[string]*stats.FolderStatisticsReference),
folderState: make(map[string]folderState),
folderStateChanged: make(map[string]time.Time),
protoConn: make(map[protocol.DeviceID]protocol.Connection),
@@ -283,6 +285,15 @@ func (m *Model) DeviceStatistics() map[string]stats.DeviceStatistics {
return res
}
+// Returns statistics about each folder
+func (m *Model) FolderStatistics() map[string]stats.FolderStatistics {
+ var res = make(map[string]stats.FolderStatistics)
+ for id := range m.cfg.Folders() {
+ res[id] = m.folderStatRef(id).GetStatistics()
+ }
+ return res
+}
+
// Returns the completion status, in percent, for the given device and folder.
func (m *Model) Completion(device protocol.DeviceID, folder string) float64 {
defer m.leveldbPanicWorkaround()
@@ -873,6 +884,23 @@ func (m *Model) deviceWasSeen(deviceID protocol.DeviceID) {
m.deviceStatRef(deviceID).WasSeen()
}
+func (m *Model) folderStatRef(folder string) *stats.FolderStatisticsReference {
+ m.fmut.Lock()
+ defer m.fmut.Unlock()
+
+ if sr, ok := m.folderStatRefs[folder]; ok {
+ return sr
+ } else {
+ sr = stats.NewFolderStatisticsReference(m.db, folder)
+ m.folderStatRefs[folder] = sr
+ return sr
+ }
+}
+
+func (m *Model) receivedFile(folder, filename string) {
+ m.folderStatRef(folder).ReceivedFile(filename)
+}
+
func sendIndexes(conn protocol.Connection, folder string, fs *files.Set, ignores *ignore.Matcher) {
deviceID := conn.ID()
name := conn.Name()
diff --git a/internal/model/puller.go b/internal/model/puller.go
index 968db7a7..5b404ff0 100644
--- a/internal/model/puller.go
+++ b/internal/model/puller.go
@@ -839,6 +839,7 @@ func (p *Puller) finisherRoutine(in <-chan *sharedPullerState) {
}
p.performFinish(state)
+ p.model.receivedFile(p.folder, state.file.Name)
if p.progressEmitter != nil {
p.progressEmitter.Deregister(state)
}
diff --git a/internal/stats/folder.go b/internal/stats/folder.go
new file mode 100644
index 00000000..0a4c199e
--- /dev/null
+++ b/internal/stats/folder.go
@@ -0,0 +1,133 @@
+// Copyright (C) 2014 The Syncthing Authors.
+//
+// This program is free software: you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by the Free
+// Software Foundation, either version 3 of the License, or (at your option)
+// any later version.
+//
+// This program is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+// more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program. If not, see .
+
+package stats
+
+import (
+ "encoding/binary"
+ "time"
+
+ "github.com/syndtr/goleveldb/leveldb"
+)
+
+const (
+ folderStatisticTypeLastFile = iota
+)
+
+var folderStatisticsTypes = []byte{
+ folderStatisticTypeLastFile,
+}
+
+type FolderStatistics struct {
+ LastFile *LastFile
+}
+
+type FolderStatisticsReference struct {
+ db *leveldb.DB
+ folder string
+}
+
+func NewFolderStatisticsReference(db *leveldb.DB, folder string) *FolderStatisticsReference {
+ return &FolderStatisticsReference{
+ db: db,
+ folder: folder,
+ }
+}
+
+func (s *FolderStatisticsReference) key(stat byte) []byte {
+ k := make([]byte, 1+1+64)
+ k[0] = keyTypeFolderStatistic
+ k[1] = stat
+ copy(k[1+1:], s.folder[:])
+ return k
+}
+
+func (s *FolderStatisticsReference) GetLastFile() *LastFile {
+ value, err := s.db.Get(s.key(folderStatisticTypeLastFile), nil)
+ if err != nil {
+ if err != leveldb.ErrNotFound {
+ l.Warnln("FolderStatisticsReference: Failed loading last file filename value for", s.folder, ":", err)
+ }
+ return nil
+ }
+
+ file := LastFile{}
+ err = file.UnmarshalBinary(value)
+ if err != nil {
+ l.Warnln("FolderStatisticsReference: Failed loading last file value for", s.folder, ":", err)
+ return nil
+ }
+ return &file
+}
+
+func (s *FolderStatisticsReference) ReceivedFile(filename string) {
+ f := LastFile{
+ Filename: filename,
+ At: time.Now(),
+ }
+ if debug {
+ l.Debugln("stats.FolderStatisticsReference.ReceivedFile:", s.folder)
+ }
+
+ value, err := f.MarshalBinary()
+ if err != nil {
+ l.Warnln("FolderStatisticsReference: Failed serializing last file value for", s.folder, ":", err)
+ return
+ }
+
+ err = s.db.Put(s.key(folderStatisticTypeLastFile), value, nil)
+ if err != nil {
+ l.Warnln("Failed update last file value for", s.folder, ":", err)
+ }
+}
+
+// Never called, maybe because it's worth while to keep the data
+// or maybe because we have no easy way of knowing that a folder has been removed.
+func (s *FolderStatisticsReference) Delete() error {
+ for _, stype := range folderStatisticsTypes {
+ err := s.db.Delete(s.key(stype), nil)
+ if debug && err == nil {
+ l.Debugln("stats.FolderStatisticsReference.Delete:", s.folder, stype)
+ }
+ if err != nil && err != leveldb.ErrNotFound {
+ return err
+ }
+ }
+ return nil
+}
+
+func (s *FolderStatisticsReference) GetStatistics() FolderStatistics {
+ return FolderStatistics{
+ LastFile: s.GetLastFile(),
+ }
+}
+
+type LastFile struct {
+ At time.Time
+ Filename string
+}
+
+func (f *LastFile) MarshalBinary() ([]byte, error) {
+ buf := make([]byte, 8+len(f.Filename))
+ binary.BigEndian.PutUint64(buf[:8], uint64(f.At.Unix()))
+ copy(buf[8:], []byte(f.Filename))
+ return buf, nil
+}
+
+func (f *LastFile) UnmarshalBinary(buf []byte) error {
+ f.At = time.Unix(int64(binary.BigEndian.Uint64(buf[:8])), 0)
+ f.Filename = string(buf[8:])
+ return nil
+}
diff --git a/internal/stats/leveldb.go b/internal/stats/leveldb.go
index e613c17f..77353bfe 100644
--- a/internal/stats/leveldb.go
+++ b/internal/stats/leveldb.go
@@ -18,4 +18,5 @@ package stats
// Same key space as files/leveldb.go keyType* constants
const (
keyTypeDeviceStatistic = iota + 30
+ keyTypeFolderStatistic
)