diff --git a/cmd/syncthing/gui.go b/cmd/syncthing/gui.go index dcc25b6ad..0e6691bb1 100644 --- a/cmd/syncthing/gui.go +++ b/cmd/syncthing/gui.go @@ -109,47 +109,47 @@ func startGUI(cfg config.GUIConfiguration, assetDir string, m *model.Model) erro // The GET handlers getRestMux := http.NewServeMux() - getRestMux.HandleFunc("/rest/ping", restPing) - getRestMux.HandleFunc("/rest/completion", withModel(m, restGetCompletion)) - getRestMux.HandleFunc("/rest/config", restGetConfig) - getRestMux.HandleFunc("/rest/config/sync", restGetConfigInSync) - getRestMux.HandleFunc("/rest/connections", withModel(m, restGetConnections)) - getRestMux.HandleFunc("/rest/autocomplete/directory", restGetAutocompleteDirectory) - getRestMux.HandleFunc("/rest/discovery", restGetDiscovery) - getRestMux.HandleFunc("/rest/errors", restGetErrors) - getRestMux.HandleFunc("/rest/events", restGetEvents) - getRestMux.HandleFunc("/rest/ignores", withModel(m, restGetIgnores)) - getRestMux.HandleFunc("/rest/lang", restGetLang) - getRestMux.HandleFunc("/rest/model", withModel(m, restGetModel)) - getRestMux.HandleFunc("/rest/need", withModel(m, restGetNeed)) - getRestMux.HandleFunc("/rest/deviceid", restGetDeviceID) - getRestMux.HandleFunc("/rest/report", withModel(m, restGetReport)) - getRestMux.HandleFunc("/rest/system", restGetSystem) - getRestMux.HandleFunc("/rest/upgrade", restGetUpgrade) - getRestMux.HandleFunc("/rest/version", restGetVersion) - getRestMux.HandleFunc("/rest/tree", withModel(m, restGetTree)) - getRestMux.HandleFunc("/rest/stats/device", withModel(m, restGetDeviceStats)) - getRestMux.HandleFunc("/rest/stats/folder", withModel(m, restGetFolderStats)) - getRestMux.HandleFunc("/rest/filestatus", withModel(m, restGetFileStatus)) - - // Debug endpoints, not for general use - getRestMux.HandleFunc("/rest/debug/peerCompletion", withModel(m, restGetPeerCompletion)) + getRestMux.HandleFunc("/rest/db/completion", withModel(m, restGetDBCompletion)) // device folder + getRestMux.HandleFunc("/rest/db/file", withModel(m, restGetDBFile)) // folder file [blocks] + getRestMux.HandleFunc("/rest/db/ignores", withModel(m, restGetDBIgnores)) // folder + getRestMux.HandleFunc("/rest/db/need", withModel(m, restGetDBNeed)) // folder + getRestMux.HandleFunc("/rest/db/status", withModel(m, restGetDBStatus)) // folder + getRestMux.HandleFunc("/rest/db/browse", withModel(m, restGetDBBrowse)) // folder [prefix] [dirsonly] [levels] + getRestMux.HandleFunc("/rest/events", restGetEvents) // since [limit] + getRestMux.HandleFunc("/rest/stats/device", withModel(m, restGetDeviceStats)) // - + getRestMux.HandleFunc("/rest/stats/folder", withModel(m, restGetFolderStats)) // - + getRestMux.HandleFunc("/rest/svc/deviceid", restGetDeviceID) // id + getRestMux.HandleFunc("/rest/svc/lang", restGetLang) // - + getRestMux.HandleFunc("/rest/svc/report", withModel(m, restGetReport)) // - + getRestMux.HandleFunc("/rest/system/browse", restGetSystemBrowse) // current + getRestMux.HandleFunc("/rest/system/config", restGetSystemConfig) // - + getRestMux.HandleFunc("/rest/system/config/insync", RestGetSystemConfigInsync) // - + getRestMux.HandleFunc("/rest/system/connections", withModel(m, restGetSystemConnections)) // - + getRestMux.HandleFunc("/rest/system/discovery", restGetSystemDiscovery) // - + getRestMux.HandleFunc("/rest/system/error", restGetSystemError) // - + getRestMux.HandleFunc("/rest/system/ping", restPing) // - + getRestMux.HandleFunc("/rest/system/status", restGetSystemStatus) // - + getRestMux.HandleFunc("/rest/system/upgrade", restGetSystemUpgrade) // - + getRestMux.HandleFunc("/rest/system/version", restGetSystemVersion) // - // The POST handlers postRestMux := http.NewServeMux() - postRestMux.HandleFunc("/rest/ping", restPing) - postRestMux.HandleFunc("/rest/config", withModel(m, restPostConfig)) - postRestMux.HandleFunc("/rest/discovery/hint", restPostDiscoveryHint) - postRestMux.HandleFunc("/rest/error", restPostError) - postRestMux.HandleFunc("/rest/error/clear", restClearErrors) - postRestMux.HandleFunc("/rest/ignores", withModel(m, restPostIgnores)) - postRestMux.HandleFunc("/rest/model/override", withModel(m, restPostOverride)) - postRestMux.HandleFunc("/rest/reset", withModel(m, restPostReset)) - postRestMux.HandleFunc("/rest/restart", restPostRestart) - postRestMux.HandleFunc("/rest/shutdown", restPostShutdown) - postRestMux.HandleFunc("/rest/upgrade", restPostUpgrade) - postRestMux.HandleFunc("/rest/scan", withModel(m, restPostScan)) - postRestMux.HandleFunc("/rest/bump", withModel(m, restPostBump)) + postRestMux.HandleFunc("/rest/db/prio", withModel(m, restPostDBPrio)) // folder file + postRestMux.HandleFunc("/rest/db/ignores", withModel(m, restPostDBIgnores)) // folder + postRestMux.HandleFunc("/rest/db/override", withModel(m, restPostDBOverride)) // folder + postRestMux.HandleFunc("/rest/db/scan", withModel(m, restPostDBScan)) // folder [sub...] + postRestMux.HandleFunc("/rest/system/config", withModel(m, restPostSystemConfig)) // + postRestMux.HandleFunc("/rest/system/discovery", restPostSystemDiscovery) // device addr + postRestMux.HandleFunc("/rest/system/error", restPostSystemError) // + postRestMux.HandleFunc("/rest/system/error/clear", restPostSystemErrorClear) // - + postRestMux.HandleFunc("/rest/system/ping", restPing) // - + postRestMux.HandleFunc("/rest/system/reset", withModel(m, restPostSystemReset)) // [folder] + postRestMux.HandleFunc("/rest/system/restart", restPostSystemRestart) // - + postRestMux.HandleFunc("/rest/system/shutdown", restPostSystemShutdown) // - + postRestMux.HandleFunc("/rest/system/upgrade", restPostSystemUpgrade) // - + + // Debug endpoints, not for general use + getRestMux.HandleFunc("/rest/debug/peerCompletion", withModel(m, restGetPeerCompletion)) // A handler that splits requests between the two above and disables // caching @@ -254,7 +254,7 @@ func restPing(w http.ResponseWriter, r *http.Request) { }) } -func restGetVersion(w http.ResponseWriter, r *http.Request) { +func restGetSystemVersion(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=utf-8") json.NewEncoder(w).Encode(map[string]string{ "version": Version, @@ -264,7 +264,7 @@ func restGetVersion(w http.ResponseWriter, r *http.Request) { }) } -func restGetTree(m *model.Model, w http.ResponseWriter, r *http.Request) { +func restGetDBBrowse(m *model.Model, w http.ResponseWriter, r *http.Request) { qs := r.URL.Query() folder := qs.Get("folder") prefix := qs.Get("prefix") @@ -282,7 +282,7 @@ func restGetTree(m *model.Model, w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode(tree) } -func restGetCompletion(m *model.Model, w http.ResponseWriter, r *http.Request) { +func restGetDBCompletion(m *model.Model, w http.ResponseWriter, r *http.Request) { var qs = r.URL.Query() var folder = qs.Get("folder") var deviceStr = qs.Get("device") @@ -301,7 +301,7 @@ func restGetCompletion(m *model.Model, w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode(res) } -func restGetModel(m *model.Model, w http.ResponseWriter, r *http.Request) { +func restGetDBStatus(m *model.Model, w http.ResponseWriter, r *http.Request) { qs := r.URL.Query() folder := qs.Get("folder") res := folderSummary(m, folder) @@ -340,13 +340,13 @@ func folderSummary(m *model.Model, folder string) map[string]interface{} { return res } -func restPostOverride(m *model.Model, w http.ResponseWriter, r *http.Request) { +func restPostDBOverride(m *model.Model, w http.ResponseWriter, r *http.Request) { var qs = r.URL.Query() var folder = qs.Get("folder") go m.Override(folder) } -func restGetNeed(m *model.Model, w http.ResponseWriter, r *http.Request) { +func restGetDBNeed(m *model.Model, w http.ResponseWriter, r *http.Request) { var qs = r.URL.Query() var folder = qs.Get("folder") @@ -362,7 +362,7 @@ func restGetNeed(m *model.Model, w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode(output) } -func restGetConnections(m *model.Model, w http.ResponseWriter, r *http.Request) { +func restGetSystemConnections(m *model.Model, w http.ResponseWriter, r *http.Request) { var res = m.ConnectionStats() w.Header().Set("Content-Type", "application/json; charset=utf-8") json.NewEncoder(w).Encode(res) @@ -380,7 +380,7 @@ func restGetFolderStats(m *model.Model, w http.ResponseWriter, r *http.Request) json.NewEncoder(w).Encode(res) } -func restGetFileStatus(m *model.Model, w http.ResponseWriter, r *http.Request) { +func restGetDBFile(m *model.Model, w http.ResponseWriter, r *http.Request) { qs := r.URL.Query() folder := qs.Get("folder") file := qs.Get("file") @@ -401,12 +401,12 @@ func restGetFileStatus(m *model.Model, w http.ResponseWriter, r *http.Request) { }) } -func restGetConfig(w http.ResponseWriter, r *http.Request) { +func restGetSystemConfig(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=utf-8") json.NewEncoder(w).Encode(cfg.Raw()) } -func restPostConfig(m *model.Model, w http.ResponseWriter, r *http.Request) { +func restPostSystemConfig(m *model.Model, w http.ResponseWriter, r *http.Request) { var newCfg config.Configuration err := json.NewDecoder(r.Body).Decode(&newCfg) if err != nil { @@ -453,17 +453,17 @@ func restPostConfig(m *model.Model, w http.ResponseWriter, r *http.Request) { cfg.Save() } -func restGetConfigInSync(w http.ResponseWriter, r *http.Request) { +func RestGetSystemConfigInsync(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=utf-8") json.NewEncoder(w).Encode(map[string]bool{"configInSync": configInSync}) } -func restPostRestart(w http.ResponseWriter, r *http.Request) { +func restPostSystemRestart(w http.ResponseWriter, r *http.Request) { flushResponse(`{"ok": "restarting"}`, w) go restart() } -func restPostReset(m *model.Model, w http.ResponseWriter, r *http.Request) { +func restPostSystemReset(m *model.Model, w http.ResponseWriter, r *http.Request) { var qs = r.URL.Query() folder := qs.Get("folder") var err error @@ -484,7 +484,7 @@ func restPostReset(m *model.Model, w http.ResponseWriter, r *http.Request) { go restart() } -func restPostShutdown(w http.ResponseWriter, r *http.Request) { +func restPostSystemShutdown(w http.ResponseWriter, r *http.Request) { flushResponse(`{"ok": "shutting down"}`, w) go shutdown() } @@ -498,7 +498,7 @@ func flushResponse(s string, w http.ResponseWriter) { var cpuUsagePercent [10]float64 // The last ten seconds var cpuUsageLock sync.RWMutex -func restGetSystem(w http.ResponseWriter, r *http.Request) { +func restGetSystemStatus(w http.ResponseWriter, r *http.Request) { var m runtime.MemStats runtime.ReadMemStats(&m) @@ -526,20 +526,20 @@ func restGetSystem(w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode(res) } -func restGetErrors(w http.ResponseWriter, r *http.Request) { +func restGetSystemError(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=utf-8") guiErrorsMut.Lock() json.NewEncoder(w).Encode(map[string][]guiError{"errors": guiErrors}) guiErrorsMut.Unlock() } -func restPostError(w http.ResponseWriter, r *http.Request) { +func restPostSystemError(w http.ResponseWriter, r *http.Request) { bs, _ := ioutil.ReadAll(r.Body) r.Body.Close() showGuiError(0, string(bs)) } -func restClearErrors(w http.ResponseWriter, r *http.Request) { +func restPostSystemErrorClear(w http.ResponseWriter, r *http.Request) { guiErrorsMut.Lock() guiErrors = []guiError{} guiErrorsMut.Unlock() @@ -554,7 +554,7 @@ func showGuiError(l logger.LogLevel, err string) { guiErrorsMut.Unlock() } -func restPostDiscoveryHint(w http.ResponseWriter, r *http.Request) { +func restPostSystemDiscovery(w http.ResponseWriter, r *http.Request) { var qs = r.URL.Query() var device = qs.Get("device") var addr = qs.Get("addr") @@ -563,7 +563,7 @@ func restPostDiscoveryHint(w http.ResponseWriter, r *http.Request) { } } -func restGetDiscovery(w http.ResponseWriter, r *http.Request) { +func restGetSystemDiscovery(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=utf-8") devices := map[string][]discover.CacheEntry{} @@ -584,7 +584,7 @@ func restGetReport(m *model.Model, w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode(reportData(m)) } -func restGetIgnores(m *model.Model, w http.ResponseWriter, r *http.Request) { +func restGetDBIgnores(m *model.Model, w http.ResponseWriter, r *http.Request) { qs := r.URL.Query() w.Header().Set("Content-Type", "application/json; charset=utf-8") @@ -600,7 +600,7 @@ func restGetIgnores(m *model.Model, w http.ResponseWriter, r *http.Request) { }) } -func restPostIgnores(m *model.Model, w http.ResponseWriter, r *http.Request) { +func restPostDBIgnores(m *model.Model, w http.ResponseWriter, r *http.Request) { qs := r.URL.Query() var data map[string][]string @@ -618,7 +618,7 @@ func restPostIgnores(m *model.Model, w http.ResponseWriter, r *http.Request) { return } - restGetIgnores(m, w, r) + restGetDBIgnores(m, w, r) } func restGetEvents(w http.ResponseWriter, r *http.Request) { @@ -647,7 +647,7 @@ func restGetEvents(w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode(evs) } -func restGetUpgrade(w http.ResponseWriter, r *http.Request) { +func restGetSystemUpgrade(w http.ResponseWriter, r *http.Request) { if noUpgrade { http.Error(w, upgrade.ErrUpgradeUnsupported.Error(), 500) return @@ -693,7 +693,7 @@ func restGetLang(w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode(langs) } -func restPostUpgrade(w http.ResponseWriter, r *http.Request) { +func restPostSystemUpgrade(w http.ResponseWriter, r *http.Request) { rel, err := upgrade.LatestGithubRelease(Version) if err != nil { l.Warnln("getting latest release:", err) @@ -715,7 +715,7 @@ func restPostUpgrade(w http.ResponseWriter, r *http.Request) { } } -func restPostScan(m *model.Model, w http.ResponseWriter, r *http.Request) { +func restPostDBScan(m *model.Model, w http.ResponseWriter, r *http.Request) { qs := r.URL.Query() folder := qs.Get("folder") if folder != "" { @@ -733,12 +733,12 @@ func restPostScan(m *model.Model, w http.ResponseWriter, r *http.Request) { } } -func restPostBump(m *model.Model, w http.ResponseWriter, r *http.Request) { +func restPostDBPrio(m *model.Model, w http.ResponseWriter, r *http.Request) { qs := r.URL.Query() folder := qs.Get("folder") file := qs.Get("file") m.BringToFront(folder, file) - restGetNeed(m, w, r) + restGetDBNeed(m, w, r) } func getQR(w http.ResponseWriter, r *http.Request) { @@ -779,7 +779,7 @@ func restGetPeerCompletion(m *model.Model, w http.ResponseWriter, r *http.Reques json.NewEncoder(w).Encode(comp) } -func restGetAutocompleteDirectory(w http.ResponseWriter, r *http.Request) { +func restGetSystemBrowse(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=utf-8") qs := r.URL.Query() current := qs.Get("current") diff --git a/gui/scripts/syncthing/core/controllers/syncthingController.js b/gui/scripts/syncthing/core/controllers/syncthingController.js index 735fceb31..be8635472 100644 --- a/gui/scripts/syncthing/core/controllers/syncthingController.js +++ b/gui/scripts/syncthing/core/controllers/syncthingController.js @@ -74,15 +74,15 @@ angular.module('syncthing.core') refreshDeviceStats(); refreshFolderStats(); - $http.get(urlbase + '/version').success(function (data) { + $http.get(urlbase + '/system/version').success(function (data) { $scope.version = data.version; }).error($scope.emitHTTPError); - $http.get(urlbase + '/report').success(function (data) { + $http.get(urlbase + '/system/report').success(function (data) { $scope.reportData = data; }).error($scope.emitHTTPError); - $http.get(urlbase + '/upgrade').success(function (data) { + $http.get(urlbase + '/system/upgrade').success(function (data) { $scope.upgradeInfo = data; }).error(function () { $scope.upgradeInfo = null; @@ -198,7 +198,7 @@ angular.module('syncthing.core') $scope.$on('ConfigSaved', function (event, arg) { updateLocalConfig(arg.data); - $http.get(urlbase + '/config/sync').success(function (data) { + $http.get(urlbase + '/system/config/insync').success(function (data) { $scope.configInSync = data.configInSync; }).error($scope.emitHTTPError); }); @@ -282,7 +282,7 @@ angular.module('syncthing.core') var key = "refreshFolder" + folder; if (!debouncedFuncs[key]) { debouncedFuncs[key] = debounce(function () { - $http.get(urlbase + '/model?folder=' + encodeURIComponent(folder)).success(function (data) { + $http.get(urlbase + '/db/status?folder=' + encodeURIComponent(folder)).success(function (data) { $scope.model[folder] = data; console.log("refreshFolder", folder, data); }).error($scope.emitHTTPError); @@ -319,7 +319,7 @@ angular.module('syncthing.core') } function refreshSystem() { - $http.get(urlbase + '/system').success(function (data) { + $http.get(urlbase + '/system/status').success(function (data) { $scope.myID = data.myID; $scope.system = data; $scope.announceServersTotal = data.extAnnounceOK ? Object.keys(data.extAnnounceOK).length : 0; @@ -339,7 +339,7 @@ angular.module('syncthing.core') return; } - $http.get(urlbase + '/completion?device=' + device + '&folder=' + encodeURIComponent(folder)).success(function (data) { + $http.get(urlbase + '/db/completion?device=' + device + '&folder=' + encodeURIComponent(folder)).success(function (data) { if (!$scope.completion[device]) { $scope.completion[device] = {}; } @@ -361,7 +361,7 @@ angular.module('syncthing.core') } function refreshConnectionStats() { - $http.get(urlbase + '/connections').success(function (data) { + $http.get(urlbase + '/system/connections').success(function (data) { var now = Date.now(), td = (now - prevDate) / 1000, id; @@ -385,25 +385,25 @@ angular.module('syncthing.core') } function refreshErrors() { - $http.get(urlbase + '/errors').success(function (data) { + $http.get(urlbase + '/system/errors').success(function (data) { $scope.errors = data.errors; console.log("refreshErrors", data); }).error($scope.emitHTTPError); } function refreshConfig() { - $http.get(urlbase + '/config').success(function (data) { + $http.get(urlbase + '/system/config').success(function (data) { updateLocalConfig(data); console.log("refreshConfig", data); }).error($scope.emitHTTPError); - $http.get(urlbase + '/config/sync').success(function (data) { + $http.get(urlbase + '/system/config/insync').success(function (data) { $scope.configInSync = data.configInSync; }).error($scope.emitHTTPError); } function refreshNeed(folder) { - $http.get(urlbase + "/need?folder=" + encodeURIComponent(folder)).success(function (data) { + $http.get(urlbase + "/db/need?folder=" + encodeURIComponent(folder)).success(function (data) { if ($scope.neededFolder == folder) { console.log("refreshNeed", folder, data); $scope.needed = data; @@ -608,8 +608,8 @@ angular.module('syncthing.core') 'Content-Type': 'application/json' } }; - $http.post(urlbase + '/config', cfg, opts).success(function () { - $http.get(urlbase + '/config/sync').success(function (data) { + $http.post(urlbase + '/system/config', cfg, opts).success(function () { + $http.get(urlbase + '/system/config/insync').success(function (data) { $scope.configInSync = data.configInSync; }); }).error($scope.emitHTTPError); @@ -658,7 +658,7 @@ angular.module('syncthing.core') $scope.restart = function () { restarting = true; $('#restarting').modal(); - $http.post(urlbase + '/restart'); + $http.post(urlbase + '/system/restart'); $scope.configInSync = true; // Switch webpage protocol if needed @@ -680,7 +680,7 @@ angular.module('syncthing.core') $scope.upgrade = function () { restarting = true; $('#upgrading').modal(); - $http.post(urlbase + '/upgrade').success(function () { + $http.post(urlbase + '/system/upgrade').success(function () { $('#restarting').modal(); $('#upgrading').modal('hide'); }).error(function () { @@ -690,7 +690,7 @@ angular.module('syncthing.core') $scope.shutdown = function () { restarting = true; - $http.post(urlbase + '/shutdown').success(function () { + $http.post(urlbase + '/system/shutdown').success(function () { $('#shutdown').modal(); }).error($scope.emitHTTPError); $scope.configInSync = true; @@ -716,7 +716,7 @@ angular.module('syncthing.core') }; $scope.addDevice = function () { - $http.get(urlbase + '/discovery') + $http.get(urlbase + '/system/discovery') .success(function (registry) { $scope.discovery = registry; }) @@ -871,7 +871,7 @@ angular.module('syncthing.core') $scope.clearErrors = function () { $scope.seenError = $scope.errors[$scope.errors.length - 1].time; - $http.post(urlbase + '/error/clear'); + $http.post(urlbase + '/system/error/clear'); }; $scope.friendlyDevices = function (str) { @@ -889,7 +889,7 @@ angular.module('syncthing.core') $scope.directoryList = []; $scope.$watch('currentFolder.path', function (newvalue) { - $http.get(urlbase + '/autocomplete/directory', { + $http.get(urlbase + '/system/browse', { params: { current: newvalue } }).success(function (data) { $scope.directoryList = data; @@ -1093,7 +1093,7 @@ angular.module('syncthing.core') } $('#editIgnoresButton').attr('disabled', 'disabled'); - $http.get(urlbase + '/ignores?folder=' + encodeURIComponent($scope.currentFolder.id)) + $http.get(urlbase + '/db/ignores?folder=' + encodeURIComponent($scope.currentFolder.id)) .success(function (data) { data.ignore = data.ignore || []; @@ -1120,7 +1120,7 @@ angular.module('syncthing.core') return; } - $http.post(urlbase + '/ignores?folder=' + encodeURIComponent($scope.currentFolder.id), { + $http.post(urlbase + '/db/ignores?folder=' + encodeURIComponent($scope.currentFolder.id), { ignore: $('#editIgnores textarea').val().split('\n') }); }; @@ -1173,7 +1173,7 @@ angular.module('syncthing.core') }; $scope.override = function (folder) { - $http.post(urlbase + "/model/override?folder=" + encodeURIComponent(folder)); + $http.post(urlbase + "/db/override?folder=" + encodeURIComponent(folder)); }; $scope.about = function () { @@ -1185,15 +1185,15 @@ angular.module('syncthing.core') }; $scope.rescanAllFolders = function () { - $http.post(urlbase + "/scan"); + $http.post(urlbase + "/db/scan"); }; $scope.rescanFolder = function (folder) { - $http.post(urlbase + "/scan?folder=" + encodeURIComponent(folder)); + $http.post(urlbase + "/db/scan?folder=" + encodeURIComponent(folder)); }; $scope.bumpFile = function (folder, file) { - $http.post(urlbase + "/bump?folder=" + encodeURIComponent(folder) + "&file=" + encodeURIComponent(file)).success(function (data) { + $http.post(urlbase + "/db/prio?folder=" + encodeURIComponent(folder) + "&file=" + encodeURIComponent(file)).success(function (data) { if ($scope.neededFolder == folder) { console.log("bumpFile", folder, data); $scope.needed = data; diff --git a/internal/auto/gui.files.go b/internal/auto/gui.files.go index 30aa4d259..2ace1bd04 100644 --- a/internal/auto/gui.files.go +++ b/internal/auto/gui.files.go @@ -5,7 +5,7 @@ import ( ) const ( - AssetsBuildDate = "Mon, 06 Apr 2015 21:33:06 GMT" + AssetsBuildDate = "Tue, 07 Apr 2015 10:16:10 GMT" ) func Assets() map[string][]byte { @@ -83,7 +83,7 @@ func Assets() map[string][]byte { assets["scripts/syncthing/core/controllers/eventController.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/7RUQYvbPBC951fMtyzY4XO9SaGnkPbQ7sKeeuiWHkoPij22BbIUNNKGUPLfO5ITr+M4bCmtLnFGM2/ePD3pWVgocePr+2fUjmANlVCEq9lM6NorYfPWlF5hmtBeF66Rus4LYzGZz4AXf2tnjVJo0yRCfOwDSQaV5xppNKS3VJgtZnDbOLedw89YHVbiCYGclYVLuOsp3OXnSpCLsExMe6VWfUIgHnYfP/HWYlAZNsgXBRI96DBPz6EUTgxbh3V3B98a1PDlNB1YJCcsS7FrpEJwDYIyHN/yUGGfJ9bYIUoCqcdwW2tqxqBYubFmR2iBk8m0CFslXGVsS9zGeasJBLxdLCAlqYvYbAzXoCjREjSCYIPMtFKeGixhJ10Te3RIzKvEgDXPui1tIAycjwGfGqa9ESQLodQeWhQ6cBUugg2m6zvyNOgyELrsUrhuDLrjXG0ciML5CMsnwBpUXp33lxWk/02dQ1horbEPujun1cV2N+d5/DA7+3t0zS220qXJ18fPmo+MvbqaXbA4euc9LKaoROX4oO5F0aQvDsJgxan8E+rgKl1LC4tVJqPY3qZObyLoTQbxN5fl6cvtw4Xpvq9I0kkwFT1T4gJvAuow/x1lh/cxcPoehVKoa3bcG1j+OAfpL+i4nMccnQlb7Em2aLwb6D2lYXxB8hpd6q1iHyP8D8ldHIs+xGu0TjjUtZ5PipMf34e0fyeu5EVHpkdfjgXK4B3ftpfgYfQIHctefYIuTFtVk679OwopyW3Wy+TfKrNcXJXmD9i9xmqSTTD0LwAAAP//AQAA//8bMA983gYAAA==") - assets["scripts/syncthing/core/controllers/syncthingController.js"], _ = base64.StdEncoding.DecodeString("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") + assets["scripts/syncthing/core/controllers/syncthingController.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/+w9/XPbuLG/31/B+OVF0lmRnfua1j7fjWsnr373kcw5aX9w3Te0BFlsKFLlhx33kv/97eKDJIAFCMr2tZ0pJxNLIrBYLBa7i8ViEWfXdRoXs3W+qFM2HpV32bxaJdn1bJ4XbDT5LIIHPmfL5Hq8rOFlkmfjp2k+j/HTmyK/SRasmES/8pL4WC9nq2qdfv1TvmDjqqjZZLaKy9Wbgi2TD+PRk9HkkFf91LZVFXmasmI8OlfYnDQ/jqaRQiMaPy3n+YZNo6erqtpM25an0Y/wKWXnrLhJ5qyL3aguWVRWRTKvRoefNT/v7UWbIrmJK7a3YumGFdEC8MsShFa2xW7iAsqxm1MoGB1F+4famyy+Sa4Bgez6+Da+g/fLOC2ZXibP0iRj9LuClVVcYP32fVOg6TVi1dJj3O0cPlrPZ3Fd5Sd89MTv48mhVrpk1VlWQeE4ldScwcAAIqtp9GIfnk75T5/p9Kqvkvker0MTS8Kb5+tNyjjqR9Gvnw7t94ie791ZhowAJZB9qDIZ46QpaSCsKPIC311cWu+A71lKV1vfnZ3Cm9HIerNgSFsHRPHyF/Y3L07LPIWZ0VdqU+RVPs/TkxXMU7awuaYZsk1eVMCUMQ1HvIcpd5OwWycUgZMDlZKx7CUSkiZJvbku4gU7y5Y5FMjqNHUQ5ryKKy9NPAWAHNfAmupt+3p8m2SL/HYyu4K/49EVW4LwqrM0jxeavDDnijVhdQb7NDm0uPkpiL+dRtCIgTmv58AO5Y6vKX1aghCS87EBBRSOi/lqPJmlAHPixyJjbHHcco7W0qhYjw6i0SlLR1PzxSIp5LtoDJ8nZgkU/1gA55v5rsrr+QpfvtssQPyNWgStgUL0zuYe5Aq2zm+YEz/6tUIORloOrQPBuASJlpTvNRSpgRy9O3vN5bHGJeyGZdU0iotrcxCTZTSWAvzZs+hJK6/NgvgUrKqLTBe3nz7TviKJ8pTN0vy6g0t3vAUgLpDP76Bba1OAy5dCxrtfSgnJJ5ej1Gk7Px0lXrUTdGwiyVXw7JpV47pIr2JQsrvRaK/kOO/dgFiB1keTWSmmyrilNvBSTJFPDpOsCoyEBdVXg6oTIeOVBmPrpPrj27dvuLwahKgQlNvgqYlgLPtYKEpJuw2OupD2IOkWY05ousgX0IxuNaaPLmXxoSwfrcnx6L8yVt3mxXtOMeg9aG6wWUarZMFGE7t0C7G/bLmqKxQq7pIuTYCTdrkcKEEMrfPxY/REkOaBpIhEyOioy/BUWPVIM+cITEzcemnW8H0gzcDWfAnTpQID6HbFsiiOEEIE6jOFziRpOYv+zCK066sV2vZxVZdAlAV8z4HX7kxg8CvIyrpgUV5XADKuRmV0W+Sw6Pnstx2sLiWw4w86YlgEgM4kQY6OYL1ClZNUOY7k8EZcBkyjLK+iOBO05j+RNdXAokDzcB+nRMSgHyZe3x1FX+3voz7t/PjtUfT173/vxfaaZTWSpw+/QZKjWytUgnTr9EsSswaKeu+E4pQbOsVQRzO5agicZbgAXQj1hQNhawcct+6q6YIrZGG0X3r0hF2YjzJTKr3KB0sQbjufZQv2QdiiD9ZH2tDpxecXsFcrtgVCwMk/59zD0d+IsM9Ok1IueIMbAfIzILe9XL5QRJgli8shNmEPjicDEeTCrAc9D4O5qliLj6a97GpTHkT7U/ItKAXf6yT7w13Fyrd5Fac+GAGl4sUCl7MHDTPO8Bd79tsCwXKthHX8/yqBz4v9/b5WAmah8iuBEUiMNDXImldnlm/4mM3q4hgM2Q3qd6eSgolytgQdH1+zSJjaaCuu4jK6YmASZCwB3V9EsQKU5ejBm6MqWtjEB2i3LLqNswqNgbh8zy0HsCAK/L6O3zMwMuarHJfq0R/QSGDRAtYvFa9DgYNqV/U1gllHi7pA5LhDLE7RxVZvplGZIxT4gqDz/H0CCADSJDBApkrWYJ8s+edlUpRVdJOUSQWmDppAFRgtCkpSokuyZDRicbZo4UHRdV6gnQSKfZnXRbSC/8oovs6niJ2kBAXn7zWoQ3RTfGa9RanKUfwTYohiPZ/Xa8BnJjDEtVEaz9l4b/z9Afz768fZ54d/KT+ftJXg21+O4L/xxV8PLz+fzD5/Ovn4V/h/bxrtPH2xQ6hELjNaAC5TwUAFkNtpKx3twMIKXbmzLL+Fpc5utHO4jj88Bybjr77cjz6PvvgK/vvym/19p0HjEDKA4G6HLN92W3oeKajwB/2sLvzxQTOh9toHHJn7Ww2nHddlsPB2uD1bgSTeXAqdG6BDXnVco0OxMN2qLRbiDQ7xcxzarbETQu88vglGreYWATdZpJdGNT5o3S+E5l6ScTfYFqt/w5fOe9/9bZjDop+ZpJfujXTaDjDRSukCpm00sQejeYK7r5cg+cdcJIkRTzIBj6KMAnMhDVMCnA4ySVkD8MJj+jY9AYha4QsEcUnPYLEFBFoIHf0vuGgoZ/KHPfjIlbe7KpA+YYtXRb5+XSTXSdYBYr0aBO4lCDlYeBeMhNi+DQC6qdNU6578IbCq8A916+IvPZVBef2ZoR8AlXSR16AQ600DDvV/lbK4RL28YcUcGBN1NdewILZv8zpdgJHRKXWVCGV8Bct4p+hX8L+NXuDaVvZzlyTrrj12u4oTYCXsXgjj06FLqGLg1QzWF4zptBzxERgdyL+0SYuP2ZkD65eQug15Dqgf3RAEpQ/kX385oNuB+uAuedWx5MtZ+62nxmmesaYCfqHLE/LGpbjxIcSbsTvm8gU9GbdVmrIuzupY67iZA9QXdcE+F1B8LCkXjz9DRdlmuM3S+oi2ap6TR4lpgzB9ArtDKAnAqumrOqjn6rkqWPzeXYSeu+GmHj725qn6eOj0TO6Y2ntnarFZsCl3Xq/XcXH3UD4ap1tJGTWlaC8Yv5NmFf2QrrIn9hq9a3B6DTWyBmGckAPtqE6Sqi1rmKLYRdCpGONii615VunBL/g0gmm+3nQm34DuI9WwMjoBdoSrYsc14TBKKMnMbSSbJvhgP3aP+sgDLRN2GXZ111KtQ+g+Ez3BbS/AYw8h+jlTs7TR+68Z+FO5wTGNVizGcI1pJIx4x4pIOua7Ow2/IpyDqAvtwIR6YII/kH8/def9oR4ZtWBXYF7NQVrD/1aURtMPzck6puU5gnvPMCRjRyuOazdRg5hxevsXUJ/kM6IYzgf5a8/mJyctuU5bXO0JIn4vEDwawc8sw42od7+coZABGyCrVIeHrOCMMRWiT5/Kbh2iyXWdmFNJy2kkl6NU/dCVYFNeRI5N+Tavc3fQMRBjPd5MfWxIZC+mae5H/lnF5YmKLXuSlC/Xm+ru9RW6BnRHpLUMN+LSxAdSCRmezDSBpXp2LNy65xXO3oCCs7/lCSijaWTtTZN1r9P8Kk6Ps4zTDiOKYJr6GiMraI26HTqlBVX+TmIq34GWKV7G81WXs8XGwJLeW7YFqCouQZ6dPoxTmyawQrvMi0phCrjEhcm+VqCc+PRTvDFc27KEUV0w3wz4vBzroCYEydyGLilAnZsEsgklL7YdpE7DrcE0tgdKyRRKMpjSwGQ9LsWbaethFanVtB0IdyCCWwepmCpTd/occULIb+OBkxGl3DrAz84hEy05JbssFesz+q00Mzh49qFSE/71D9H3GuvZBSazlGXX1So6MK06fPhqM06E4+aCMJIa06/kmKD1R7ThWWk+sYtfCFjexZpAarapy9VYFN/SN+4m6ivVb9EWYSAS2lVw1Q6pVYP9qm6mtabf1LEoRtKKEtym7nDhlsErTsOnFd3fiwa58SPbhjLPHtwkci2x3MuLziDbFRyeXyeb2BAuQpdW+HiXV/iQSyx8ApZZfhIMWWVxTJwrLZpA+LhXXN7Fluq4veCim3LCJ9dcQVO3nVs4fbXZNfXQ+hHmuBGyO0RDdQIiBqkpfoYlxwMC7VYlzZ4VisQxln3enIeZAKG54U+z3YIYgc5RGoDlYPZkoRRKvwoB2+H1LR482rCiuoOqXo/dVqxd3HkgIhIXyeJyxkNMoFs/xdVqto4/jGE9NO68baNDgIJEHItZColbLTzOxAa2CF9xNq1Fprjb1op5G/8UzeNqvorGZESkkzCEaHN3xVF4gFrXDwnRZhUtD5p6j6bPedGBU1ycadrGCG1OQwmbi38Lo4XA8xHNGnGEYaCkgzqDyGB7EBy+Dwc7QI3tSDC0V/96W/3usetueASM3w7ajLixo1xlOw9qF261c0QNN3YrzEmmNemUMJ/uS3cRImCGZoZ5L+mB4NEJe8KO2dmC1fRTfXS3G5tVLghas7VTu8dk75RsrLw0LqtzDP8D84HdcqNlHFDcP4S+mqfxXckNH9XapNWg3halaQR/fvfNV2QoWZD46Yz5PcXwNPria364l2KtV9pBzHuylpg827CWfh60h7Ws7fBO7YBN7k7pxlGGo/cKVv0BHnlf9VlcEQzaU+MejgyKcTqtPTjj6MfGtQ0rk3KBJxkDDisqm4nejLJoXJcaXuIF4ehEjqjuNixfUnst6Obk4dWgTEZ1xg+9o+PR6UzBUu8zPA/idatgq20Lyj8rXXLfwmLY30K5igtAo7cJd4/AKr+JU1hoPcGeeTtUVvlm09eaKozuHk+r/BhIwAiewMT4rQdwby96J8bOSYokW+aPMLC8ZTGmzqZv4yLDg0mPO+Z48A7nmQeRBR4xKvx4qJBOxlMHDGIJ1Q1ZHeoni5T5GVSoGQslN0i0svkpLw/UTZHwGJYBUOdxlj0EWAe7EbMFO/JGhDDiOQl7wgybLUME3QvTqLFJQ7Ug9ya5q8F9+MPdhsVnm3nVRIiSDSZ8ASQa3KOLdHAydQ/HgztWlmkO2hKa86sguSs25yfYA3ba9FMyjUuG2A/tWfz0bKY+exa269p4Uo84Vd0bg4JH8/cjwrb1HZNQNaVep6qHaJp1ktWlf3a0BrphDYQMhigjDOOyU0MJ8z7ehVmEQbPBAvvfcfClv2JLBlBSeCADgI7qHokkmWPRPTMZwCO2vfGoLMIVPnLHg6n7f0fuofU272cI+9CaVJDJQ7QQ9ulXvKLPGM4TxjXifEWWacE1vhGzLSKs4JE3+Homz5eGGBffB82Lbiavf51udhKM7Uaj/w4ypvzdBXNncSo3zq2O2rvn2M81boJ0w6WaMJskrVg3pYqvP1lDC7Qh1WdzqW6TSbauRM0T/5qxsegCKCUhX+xfBjDIz/Gaoph/ndaUGWBu7uz0WZstd2WAlAeUXjCAIjbfzsr6qqwK3Gj7xm8OVqukPKVJRQaZKx60qptuEYueQ4g5ll4KWXUSSNwwyg4j6xY0ZYukOmcVHggvvRQFWf+TONqN2UDwzBTU17PDKDqvN683arNQpcjEwvQJdjpKsAUyq4uXWXwlAonG1OvmAPx30X4vNG2uEZxBUNwGgokh34kMTl7cOuVUosg/erH8n3dnfqJd1wmVg0mOIHXMmVrqxjesCe71T6I5Spbof89f/zzDvJ/ZdbK8swKAzUowsnbyOnya+HjaHMGQxArW38/fwmTkueg2mzQRGf72/lbm2ajPPjFIwz3rm7z0bX9OsY9TjjPlZidd7I+z/9gZoWF7kLzr2/qkafYYJBNKTAdV5mvGk7FEc5E6x+alJhHnE8Xh7O91nJa0YJjaE2/CU0h5K8MEmeoTihD2EhPHeuJkxebvsZwzYwaTkx7zZCQl/+xbE5DCrF0J0MLsW0/GKW9FvmBwJ1zoxv5thdh3W+P1nAxM8w4BStDnMlneQ9DfltzhfSGl+VFoQeDcF18MXJ8F40BuinoJq7LjRrdJmka49c7TsLBmlvL4BJ7Ey7/cVbMO07K+/fGce8S1+Sdf9NDZztZrJzp0d+sYFMUd3yZUqjDC1LBpemcLb4fOJ0eytRZsTEih5dDeHRHWBwhI6QYixJkF4WKknYnBgynkuZXRJXFw4T27C9JGqovqzJfzJe5fn1fFzuWsBPVdjfcuounl7h7YJvGm0+4H/ylobtd+mIHRYW12NrzgOCbhonBr99iJF/ttqh3MRrfjV51yxvTs43bSddpM7sieZ1p9XtNG1vceiTLygpuK/fw2wcDEW3a1QSXYiAuY+yJOx+U+MyayK1S2AQgLLezLiBg2n5xxMY8Jl/SJ2U3BaL9N1iyvq4AjjCJh9qxJPt1pU30kGrU3/9XjFIFE7spPPvZTivKe7CfAbM19viS7pDkdxPFu5Mg0kaHpeIdA9FvNMnvlvYjvpWsnP2Y4Ya2kmluuEzo99d4r4PAxOB2ChHtLNVMXBSwGm5pP8YwTyxbjXz9NWz8SjSI2CUR++QHUopPYWtFzli5xEW87qCLj9A9Nky6yynfM5MnSFmbzwnlstWued1DzxatqTZcs5c74V+R9BEZVfdeFgjfsbGUoVp3jPg4rz3v0WcP+JRApL2ZPQYK/KfhwW/49nActEwY6SRLKiW2xKkBOFn/vJMYtV/ntyA8ZmCAEtM/JwDflwKK7k5fMdB9COBTsGihT9Nl5DVRATFWhxsZuslqxLOTsPz2z3WZgdyLh5QV3YKkn5uUK3Qe3M7AGoAHl16yK0XfiqZDgXTCLes4APle37qIGEx/AzKLNUtpadYomQsvTdaSM6i8fPDOaer0zpOlcX8gGpssNnDlEi6TmJWSiIt+2ZzG1baaH23fqLH51ARi2G6Ubuy7sDk1b/SyL5iggblmUxhVmcl1gID1mLpX7Ges4q3E1PI3E7SD8XXKd5UWcmtAKNs+LxcyDGK/IpBCzkxzor21aJuSiQBJTxtQNJKL2QxPWLA6/adGQZDizXoKfnrJoT7wM5JIH4RSKW2iephe5DjfvA09UC7JEhLQs+nTkz+z2tDHBLLvRvePHN0PJzDUC2IE6mmqVCNY2wVomQLv0aRVzT8NB4h6DGFT7Oimlx6tJ8apoGcgnxJ6RN3xhgXn7okRHiDCGaRMZBkE6kEbTUZDzyOs0ssQEYkdrU3FylrtVoyT61lQOIk4AXu3u9gQDyRoXyWV3NXFE7IIHHeBBQF1a0bpc9os2rPFxpM3zhvqIU8I5fXOHQR+eUsLFj15FHJxE5h4aEmDiROfpS/+NFaTNQj3sPmBhaSjQtilDVvmOBjkrXTjuI1CPOI+EiWa9lm6Dpz1PKVXdM2dN7N2QjLk8YCrrmIsOuidp9+nJc4kPvRIRb9xrH54GHlHpw9lDWT7b+3tsat8uxfw985zbd6y/fFtq/t48lL2nHsru6526Ib3vz2J6L9uQNhcCzDD9upSFXr852+l3vHDpqFLYOx2HLq8hKWI7KsltstJbQ/c3oHK8XaPVBT7vMOeWh1+L2vmyepbx7e5ob4RQMo3MJD33s58yS52DzLVnAb9fTDerul7anoVYv/njoQ4YCiHD2S5JOnKlywwmq2kildintk5zdmL/Sr8LHr35PyZl385kl/9Edgub/XxRi4AvXpXyXTOt1MW3g7hvnrK4eKlSbXiWpkYjLZUF7hd6T2R87/PoxSVHc8jeCwexxxHr8e4ui4Rli/SO4pCystzmra217Xxpw/QCZk3JNyTg/+ZembmWflADgXEP+N5kPDIEFWD66cIVaigPtqXNZI89eguM8yov7mQ7mHDPLPP0FqOyxyPpjRBm6WwTVystg3XGbm/itLb1jM8vf1XktyVeZ2kPEyxm4jUu7yPZ8EGkmrBTWwzPJGF0fPglqm05egdPpQIJOUis+3uamlpQS1vZdvZS9fkIzcoUJeHzF5POrpygPX9/zpDMQIf+/bIO1Mh0xdkt7k8jaDRgU0qHoNY+rTAwd+PIao3qt/beSN0f0vRFpmWDtRce1MkIErC8RRgX0J3TTI4iM4yrF+nyygRPmpDp8ugO8PKY0uFPbYuuJRMJYanVPecE4VpC4RIIR5T+gbEN1N3t67GY6LP3UNygsHU9wwMRtoqvrxlYuwNoq6o8EnkbjEIprCr8FH845qevO+eEQym+FnVlmhhPoB3d9Ako90wFVQ4Y6Hm33tBGJf3KNx4xZDd506n12/AYhl4UmSPbJQlG1XgcDmvwCYSkyp/k63XMXS+hoysqkFQOpIS7F1memUIoRKl0xVFfiY8fo68DNI5zFgwpDW3Zd/3dn//pwtAYHmQznbOmJJnHWcRTdaR3GN38D1bgbY2rhMc2RuWK31CFtzVLe9iEh9dMSkfxMq7TKhIWW76Ern49i85zvGn6jl9N2S0FEzCpRqUJLZ5X3M3cniKcWUpXzynRIyf7z6kFylvozWBGDJxUZjFq5JzBEc64LWE/Doj+EdgERv/EiwVh8AbaufYgGMZY4CafTsaCYVYUNdnOoZ1vQqbaIOnTL28GCRM3dw0TQveUKuaB10BmDqqGBzJ+zos1iJh/0NtuQ+J+flvePs4W55gqiVjUqQhLB8dLb6gA03pDjbr95CMnC24SSEiPMpHMlZF0StOh8P+Ziv+Zio83FXmmMlHjz2BoEC73oOm41MNq+/bmzL04rx9A31dZNmHFIR66bk8DN1iCRYojUiVAa7cZL0/w5G8TpRIynGTYUwPMYQE5Snc2Hc2LQdoyprDq7HHQfhwjX+zZKW7hO+G5AljcCHS8SEeifddei528r2ev2ORLx84weezLY7vKPUlnl4hAibasS2b3eLRaADfdtS/d95E67y4AOqKVR2/4inTkOj3Py6DXCSGNmqveeIcbtUET1CanTWGbioR/LrjaDz7vWCD1vW6vYQNQqQFQMF1jsAkYA+GHUqPQnUqGMv5ceqrcIecjzblEDCyppj3wup4jD7iu1n5IlqHdjkNqCtINqXHi98+5K/5J87Ldj1m9/rPthIUCeR9xIb1bNicYJtgD8gDtFxxQ8WSQR84Cc+Nok46Y0S2rJgVuC+/+xlK4teQO1DGspgEWpB6ws9ThqH7jie7nO82lVP74HW7TlkO2C/nVOfG6xxJyb4rRPcOnk2+pG4EVECjC8dEiMTp74opaTaYzs5GJuWXOaeW1s0WDPACWjvMQBfi5wZ1ptEPfcaDh+qrlv7CA7ZZh7WHQUsULq9JgZUdsgjO0ToFq1iuEYLSDIwZEdLajf8+wTYmxYAeFticu0ROwOTBwT7Xs4QtZxC8m+CwP8WgOWPY8/LEsShg1Sx59sQ9i+J8serHLZzzM0B+l9Ain1+Qgydb/UFdVjge846oqxiOVEQcPFzefyQP8xF2EIm6y7xZmx4hMgg6j+tJf8URXAgcZxKK+ffyoB/NQ9AhhWvXwSwTx0kyYqiiadJLyV6DGYuuCX/WoujMwKscdROXB7r/AeLiqGm21riKnPJnhffvQmwXLZlelKK4FK/XGb/c6p8yHOOWrYYPnnLdEpiHdMp/XVhCkjgShRe9x/Ngxb8SRj2N99gw/+4qS458kEOjYxXvPZyqOTUA88MwYPiUm6uwWzgSn4UNRkVXHb85+4NfXtzSc2wYLBi7Gm0SULGBFkK/PeYrC8Zdf9Hld89t3v7wpQPOz2151aCUCoo8+YiKRQsJsJ9hWM7cvpWMAFWOede3dL0Hbl/qN53YqOdy5/jEuYFEcVas44xvdKX4vq4gpJ7pIkxfJ5VW4Zm2J5yYwadHM0yRj9++hmZTuMZBFhsPr0IjlkANj/fo1acSY5p91e5yNqIBzX34kcXIkQrYquIv28DBWPybWs8StUnxlciqsx6Poq/3ff3NIvFcxssjX33z5u68Ixy+HPlum8XUZPYO2JMzdTu3JhLt0yFfuyPhRsV4k1l0vrRtJb1gC11ryAw+H3CIrgIcgX+X13Lxewuly6V5K4MwnTp2TAdlRJIuQu1dIhccvRlRAAi9H9AvRq7z2R6vjFOOlBiWAwSK/cHEZpINEpcKo0Jt2SWxSH6cp5QYIJygC6c96B4WcHp9hbT3EwF3V6w36F0k/GCU/3ChtiiQPQwlrPEPgznLY8G9/Hacixr/AXZydkQKTYlOyepFH6zjJZhEm6xRZR+FDxNVFIjJqxmUJNmcn4SC+wUzRRQ5VCqWeUZn8PwAAAP//AQAA//+D9Ca3ka8AAA==") assets["scripts/syncthing/core/directives/identiconDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/5xVTVPbMBC951dsZwp2GkcOdHpJ6s4wDMxwgENz6IEyHVdWYk0VKSPLcSnkv3clJ8F2FL50wUj79r2V3m5SOS9FqslCZaVgYVDcS2pyLueEKs2Cfg9wkYxrRg1fYQDPmDScKhlEcBt8rLjMVIXfsxKBXEkIN3t9eHBgu1aphmI1v5lCAkFuzHIcx1VVkeozUXoen45GoxjPg0lvB9nlu9oShqtUlCyCgv9jzeQNAkyfKVouEEGoZqlhF4LZ/26moeOPILA8/ck+OlelyC65EN+x1DODqZ5K0qqKgCrRpbVLM1NqCR+2dZNlqgt2JU2tl9A81ecqY2fGpoGBzQOf6ioiOBn14QhOO4LWh/Rdc62Vfq9Cy2nZ4PjYqUiSBBY8ywQ7R+RLChaOGyMvlW5xP0/rSIeObwgnL9Y5e/sLWJj152te38bZ5/eopYYUDHmN5r9Lg1b/i7YO69eyp1PnuwEER13/HMDfW7x983fiK56ZHHNswW/B5ozPc+MD76Hxaki6XDKZnedcZKFFvOxHG+XZVdX+Jl6hz00b3/lTW8kdrVZnu0gq0qLAGhtDqSPcmS+p/zw+wpf26e5uEuzDEcQurh2yk4kx16nJCWVc1I0UY9vWlm4h+AzqzvdbFQ8wVT0ajJpiLXIe9olmS5FSFsa3P3/8uos5FuV9rBn2nvNUAqOJvW74WquGwUC3h+4ezLV84+JdT36D4ckEhsMDvdWsqjsin5ryOaSj92A8xfkJmzPv9ZQ+2uYEc1PL00vNtT546j/Z323vrHsd+9UDcjV/ktEI2Rw/dDAFWoaaMQQXQdT2OlVLNj5kOgQkQVtNGy64/DNuTFyXLgJWj9AI0m3fFb6r34RtBkkoWdX44XapSN0U3cnSa3+t7zDgPwAAAP//AQAA//9afsjulQgAAA==") diff --git a/test/http_test.go b/test/http_test.go index c6a51b8de..e2d94d253 100644 --- a/test/http_test.go +++ b/test/http_test.go @@ -18,18 +18,27 @@ import ( ) var jsonEndpoints = []string{ - "/rest/completion?device=I6KAH76-66SLLLB-5PFXSOA-UFJCDZC-YAOMLEK-CP2GB32-BV5RQST-3PSROAU&folder=default", - "/rest/config", - "/rest/config/sync", - "/rest/connections", - "/rest/errors", - "/rest/events", - "/rest/lang", - "/rest/model?folder=default", - "/rest/need", - "/rest/deviceid?id=I6KAH7666SLLLB5PFXSOAUFJCDZCYAOMLEKCP2GB32BV5RQST3PSROAU", - "/rest/report", - "/rest/system", + "/rest/db/completion?device=I6KAH76-66SLLLB-5PFXSOA-UFJCDZC-YAOMLEK-CP2GB32-BV5RQST-3PSROAU&folder=default", + "/rest/db/ignores?folder=default", + "/rest/db/need?folder=default", + "/rest/db/status?folder=default", + "/rest/db/browse?folder=default", + "/rest/events?since=-1&limit=5", + "/rest/stats/device", + "/rest/stats/folder", + "/rest/svc/deviceid?id=I6KAH76-66SLLLB-5PFXSOA-UFJCDZC-YAOMLEK-CP2GB32-BV5RQST-3PSROAU", + "/rest/svc/lang", + "/rest/svc/report", + "/rest/system/browse?current=.", + "/rest/system/config", + "/rest/system/config/insync", + "/rest/system/connections", + "/rest/system/discovery", + "/rest/system/error", + "/rest/system/ping", + "/rest/system/status", + "/rest/system/upgrade", + "/rest/system/version", } func TestGetIndex(t *testing.T) { @@ -194,7 +203,7 @@ func TestPOSTWithoutCSRF(t *testing.T) { // Should fail without CSRF - req, err := http.NewRequest("POST", "http://127.0.0.1:8082/rest/error/clear", nil) + req, err := http.NewRequest("POST", "http://127.0.0.1:8082/rest/system/error/clear", nil) if err != nil { t.Fatal(err) } @@ -241,7 +250,7 @@ func TestPOSTWithoutCSRF(t *testing.T) { // Should fail with incorrect CSRF - req, err = http.NewRequest("POST", "http://127.0.0.1:8082/rest/error/clear", nil) + req, err = http.NewRequest("POST", "http://127.0.0.1:8082/rest/system/error/clear", nil) if err != nil { t.Fatal(err) } diff --git a/test/manypeers_test.go b/test/manypeers_test.go index 690a2d666..594109639 100644 --- a/test/manypeers_test.go +++ b/test/manypeers_test.go @@ -45,7 +45,7 @@ func TestManyPeers(t *testing.T) { } defer receiver.stop() - resp, err := receiver.get("/rest/config") + resp, err := receiver.get("/rest/system/config") if err != nil { t.Fatal(err) } @@ -70,7 +70,7 @@ func TestManyPeers(t *testing.T) { var buf bytes.Buffer json.NewEncoder(&buf).Encode(cfg) - resp, err = receiver.post("/rest/config", &buf) + resp, err = receiver.post("/rest/system/config", &buf) if err != nil { t.Fatal(err) } diff --git a/test/syncthingprocess.go b/test/syncthingprocess.go index ba3e86520..5bb01dbb1 100644 --- a/test/syncthingprocess.go +++ b/test/syncthingprocess.go @@ -79,7 +79,7 @@ func (p *syncthingProcess) start() error { for { time.Sleep(250 * time.Millisecond) - resp, err := p.get("/rest/system") + resp, err := p.get("/rest/system/status") if err != nil { continue } @@ -89,14 +89,14 @@ func (p *syncthingProcess) start() error { resp.Body.Close() if err != nil { // This one is unexpected. Print it. - log.Println("/rest/system (JSON):", err) + log.Println("/rest/system/status (JSON):", err) continue } id, err := protocol.DeviceIDFromString(sysData["myID"].(string)) if err != nil { // This one is unexpected. Print it. - log.Println("/rest/system (myID):", err) + log.Println("/rest/system/status (myID):", err) continue } @@ -241,7 +241,7 @@ type model struct { } func (p *syncthingProcess) model(folder string) (model, error) { - resp, err := p.get("/rest/model?folder=" + folder) + resp, err := p.get("/rest/db/status?folder=" + folder) if err != nil { return model{}, err } @@ -283,7 +283,7 @@ type versionResp struct { } func (p *syncthingProcess) version() (string, error) { - resp, err := p.get("/rest/version") + resp, err := p.get("/rest/system/version") if err != nil { return "", err } @@ -298,7 +298,7 @@ func (p *syncthingProcess) version() (string, error) { } func (p *syncthingProcess) rescan(folder string) error { - resp, err := p.post("/rest/scan?folder="+folder, nil) + resp, err := p.post("/rest/db/scan?folder="+folder, nil) if err != nil { return err } @@ -311,7 +311,7 @@ func (p *syncthingProcess) rescan(folder string) error { } func (p *syncthingProcess) reset(folder string) error { - resp, err := p.post("/rest/reset?folder="+folder, nil) + resp, err := p.post("/rest/system/reset?folder="+folder, nil) if err != nil { return err }