diff --git a/gui/default/index.html b/gui/default/index.html index 0c6e352c..777bf99f 100644 --- a/gui/default/index.html +++ b/gui/default/index.html @@ -544,13 +544,17 @@  Upload Rate {{connections[deviceCfg.deviceID].outbps | binary}}B/s ({{connections[deviceCfg.deviceID].outBytesTotal | binary}}B) - +  Address - + {{deviceAddr(deviceCfg)}} + + {{addr}}
+ {{addr}}
+  Connection Type diff --git a/gui/default/syncthing/core/syncthingController.js b/gui/default/syncthing/core/syncthingController.js index e28259ac..ece4e279 100755 --- a/gui/default/syncthing/core/syncthingController.js +++ b/gui/default/syncthing/core/syncthingController.js @@ -29,6 +29,7 @@ angular.module('syncthing.core') $scope.myID = ''; $scope.devices = []; $scope.deviceRejections = {}; + $scope.discoveryCache = {}; $scope.folderRejections = {}; $scope.protocolChanged = false; $scope.reportData = {}; @@ -85,6 +86,7 @@ angular.module('syncthing.core') console.log('UIOnline'); refreshSystem(); + refreshDiscoveryCache(); refreshConfig(); refreshConnectionStats(); refreshDeviceStats(); @@ -418,6 +420,22 @@ angular.module('syncthing.core') }).error($scope.emitHTTPError); } + function refreshDiscoveryCache() { + $http.get(urlbase + '/system/discovery').success(function (data) { + for (var device in data) { + for (var i = 0; i < data[device].addresses.length; i++) { + // Relay addresses are URLs with + // .../?foo=barlongstuff that we strip away here. We + // remove the final slash as well for symmetry with + // tcp://192.0.2.42:1234 type addresses. + data[device].addresses[i] = data[device].addresses[i].replace(/\/\?.*/, ''); + } + } + $scope.discoveryCache = data; + console.log("refreshDiscoveryCache", data); + }).error($scope.emitHTTPError); + } + function recalcLocalStateTotal () { $scope.localStateTotal = { bytes: 0, @@ -609,6 +627,7 @@ angular.module('syncthing.core') $scope.refresh = function () { refreshSystem(); + refreshDiscoveryCache(); refreshConnectionStats(); refreshErrors(); }; diff --git a/lib/discover/cache.go b/lib/discover/cache.go index 7f16446b..37c8a70a 100644 --- a/lib/discover/cache.go +++ b/lib/discover/cache.go @@ -13,6 +13,7 @@ import ( "github.com/syncthing/syncthing/lib/protocol" "github.com/syncthing/syncthing/lib/sync" + "github.com/syncthing/syncthing/lib/util" "github.com/thejerf/suture" ) @@ -165,12 +166,17 @@ func (m *cachingMux) Cache() map[protocol.DeviceID]CacheEntry { m.mut.RLock() for i := range m.finders { - // Each finder[i] has a corresponding cache at cache[i]. Go through it - // and populate the total, if it's newer than what's already in there. - // We skip any negative cache entries. + // Each finder[i] has a corresponding cache at cache[i]. Go through + // it and populate the total, appending any addresses and keeping + // the newest "when" time. We skip any negative cache entries. for k, v := range m.caches[i].Cache() { - if v.found && v.when.After(res[k].when) { - res[k] = v + if v.found { + cur := res[k] + if v.when.After(cur.when) { + cur.when = v.when + } + cur.Addresses = append(cur.Addresses, v.Addresses...) + res[k] = cur } } @@ -178,13 +184,23 @@ func (m *cachingMux) Cache() map[protocol.DeviceID]CacheEntry { // finder is a global discovery client, it will have no cache. If it's // a local discovery client, this will be it's current state. for k, v := range m.finders[i].Cache() { - if v.found && v.when.After(res[k].when) { - res[k] = v + if v.found { + cur := res[k] + if v.when.After(cur.when) { + cur.when = v.when + } + cur.Addresses = append(cur.Addresses, v.Addresses...) + res[k] = cur } } } m.mut.RUnlock() + for k, v := range res { + v.Addresses = util.UniqueStrings(v.Addresses) + res[k] = v + } + return res } diff --git a/lib/versioner/simple.go b/lib/versioner/simple.go index c2622c43..e8de2e8e 100644 --- a/lib/versioner/simple.go +++ b/lib/versioner/simple.go @@ -12,6 +12,7 @@ import ( "strconv" "github.com/syncthing/syncthing/lib/osutil" + "github.com/syncthing/syncthing/lib/util" ) func init() { @@ -102,7 +103,7 @@ func (v Simple) Archive(filePath string) error { // Use all the found filenames. "~" sorts after "." so all old pattern // files will be deleted before any new, which is as it should be. - versions := uniqueSortedStrings(append(oldVersions, newVersions...)) + versions := util.UniqueStrings(append(oldVersions, newVersions...)) if len(versions) > v.keep { for _, toRemove := range versions[:len(versions)-v.keep] { diff --git a/lib/versioner/staggered.go b/lib/versioner/staggered.go index 0ab82d65..6cb05a11 100644 --- a/lib/versioner/staggered.go +++ b/lib/versioner/staggered.go @@ -14,6 +14,7 @@ import ( "github.com/syncthing/syncthing/lib/osutil" "github.com/syncthing/syncthing/lib/sync" + "github.com/syncthing/syncthing/lib/util" ) func init() { @@ -280,7 +281,7 @@ func (v Staggered) Archive(filePath string) error { // Use all the found filenames. versions := append(oldVersions, newVersions...) - v.expire(uniqueSortedStrings(versions)) + v.expire(util.UniqueStrings(versions)) return nil } diff --git a/lib/versioner/util.go b/lib/versioner/util.go index 5b61f67e..d6d9914e 100644 --- a/lib/versioner/util.go +++ b/lib/versioner/util.go @@ -9,7 +9,6 @@ package versioner import ( "path/filepath" "regexp" - "sort" ) // Inserts ~tag just before the extension of the filename. @@ -32,17 +31,3 @@ func filenameTag(path string) string { } return match[1] } - -func uniqueSortedStrings(strings []string) []string { - seen := make(map[string]struct{}, len(strings)) - unique := make([]string, 0, len(strings)) - for _, str := range strings { - _, ok := seen[str] - if !ok { - seen[str] = struct{}{} - unique = append(unique, str) - } - } - sort.Strings(unique) - return unique -}