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
-}