Pause and resume devices (ref #215)

This commit is contained in:
Jakob Borg committed 2015-08-23 22:00:21 +02:00
1 parent 1e447741ee
commit 944d9c84a0
10 files changed
+154 -23

No files matched your search

+8
View File
@@ -158,6 +158,10 @@ next:
l.Infof("Connected to already connected device (%s)", remoteID)
c.Conn.Close()
continue
} else if s.model.IsPaused(remoteID) {
l.Infof("Connection from paused device (%s)", remoteID)
c.Conn.Close()
continue
}
for deviceID, deviceCfg := range s.cfg.Devices() {
@@ -235,6 +239,10 @@ func (s *connectionSvc) connect() {
continue
}
if s.model.IsPaused(deviceID) {
continue
}
connected := s.model.ConnectedTo(deviceID)
s.mut.RLock()
+28
View File
@@ -169,6 +169,8 @@ func (s *apiSvc) Serve() {
postRestMux.HandleFunc("/rest/system/restart", s.postSystemRestart) // -
postRestMux.HandleFunc("/rest/system/shutdown", s.postSystemShutdown) // -
postRestMux.HandleFunc("/rest/system/upgrade", s.postSystemUpgrade) // -
postRestMux.HandleFunc("/rest/system/pause", s.postSystemPause) // device
postRestMux.HandleFunc("/rest/system/resume", s.postSystemResume) // device
// Debug endpoints, not for general use
getRestMux.HandleFunc("/rest/debug/peerCompletion", s.getPeerCompletion)
@@ -833,6 +835,32 @@ func (s *apiSvc) postSystemUpgrade(w http.ResponseWriter, r *http.Request) {
}
}
func (s *apiSvc) postSystemPause(w http.ResponseWriter, r *http.Request) {
var qs = r.URL.Query()
var deviceStr = qs.Get("device")
device, err := protocol.DeviceIDFromString(deviceStr)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
s.model.PauseDevice(device)
}
func (s *apiSvc) postSystemResume(w http.ResponseWriter, r *http.Request) {
var qs = r.URL.Query()
var deviceStr = qs.Get("device")
device, err := protocol.DeviceIDFromString(deviceStr)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
s.model.ResumeDevice(device)
}
func (s *apiSvc) postDBScan(w http.ResponseWriter, r *http.Request) {
qs := r.URL.Query()
folder := qs.Get("folder")
+9
View File
@@ -123,6 +123,15 @@ func (s *verboseSvc) formatEvent(ev events.Event) string {
delete(sum, "ignorePatterns")
delete(sum, "stateChanged")
return fmt.Sprintf("Summary for folder %q is %v", data["folder"], data["summary"])
case events.DevicePaused:
data := ev.Data.(map[string]string)
device := data["device"]
return fmt.Sprintf("Device %v was paused", device)
case events.DeviceResumed:
data := ev.Data.(map[string]string)
device := data["device"]
return fmt.Sprintf("Device %v was resumed", device)
}
return fmt.Sprintf("%s %#v", ev.Type, ev)
+3
View File
@@ -113,6 +113,8 @@
"Override Changes": "Override Changes",
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for",
"Path where versions should be stored (leave empty for the default .stversions folder in the folder).": "Path where versions should be stored (leave empty for the default .stversions folder in the folder).",
"Pause": "Pause",
"Paused": "Paused",
"Please consult the release notes before performing a major upgrade.": "Please consult the release notes before performing a major upgrade.",
"Please wait": "Please wait",
"Preview": "Preview",
@@ -130,6 +132,7 @@
"Restart": "Restart",
"Restart Needed": "Restart Needed",
"Restarting": "Restarting",
"Resume": "Resume",
"Reused": "Reused",
"Save": "Save",
"Scanning": "Scanning",
+12 -5
View File
@@ -425,6 +425,7 @@
<span ng-switch-when="syncing">
<span class="hidden-xs" translate>Syncing</span> ({{completion[deviceCfg.deviceID]._total | number:0}}%)
</span>
<span ng-switch-when="paused"><span class="hidden-xs" translate>Paused</span><span class="visible-xs">&#9724;</span></span>
<span ng-switch-when="disconnected"><span class="hidden-xs" translate>Disconnected</span><span class="visible-xs">&#9724;</span></span>
<span ng-switch-when="unused"><span class="hidden-xs" translate>Unused</span><span class="visible-xs">&#9724;</span></span>
</span>
@@ -434,18 +435,18 @@
<div class="panel-body">
<table class="table table-condensed table-striped">
<tbody>
<tr ng-if="connections[deviceCfg.deviceID]">
<tr ng-if="connections[deviceCfg.deviceID].connected">
<th><span class="fa fa-fw fa-cloud-download"></span>&nbsp;<span translate>Download Rate</span></th>
<td class="text-right">{{connections[deviceCfg.deviceID].inbps | binary}}B/s ({{connections[deviceCfg.deviceID].inBytesTotal | binary}}B)</td>
</tr>
<tr ng-if="connections[deviceCfg.deviceID]">
<tr ng-if="connections[deviceCfg.deviceID].connected">
<th><span class="fa fa-fw fa-cloud-upload"></span>&nbsp;<span translate>Upload Rate</span></th>
<td class="text-right">{{connections[deviceCfg.deviceID].outbps | binary}}B/s ({{connections[deviceCfg.deviceID].outBytesTotal | binary}}B)</td>
</tr>
<tr>
<th>
<span class="fa fa-fw fa-link"></span>
<span translate ng-if="connections[deviceCfg.deviceID].type.indexOf('basic') == 0" >Address</span>
<span translate ng-if="connections[deviceCfg.deviceID].type.indexOf('direct') == 0" >Address</span>
<span translate ng-if="connections[deviceCfg.deviceID].type.indexOf('relay') == 0" >Relayed via</span>
</th>
<td class="text-right">{{deviceAddr(deviceCfg)}}</td>
@@ -461,11 +462,11 @@
<th><span class="fa fa-fw fa-thumbs-o-up"></span>&nbsp;<span translate>Introducer</span></th>
<td translate class="text-right">Yes</td>
</tr>
<tr ng-if="connections[deviceCfg.deviceID]">
<tr ng-if="connections[deviceCfg.deviceID].version">
<th><span class="fa fa-fw fa-tag"></span>&nbsp;<span translate>Version</span></th>
<td class="text-right">{{connections[deviceCfg.deviceID].clientVersion}}</td>
</tr>
<tr ng-if="!connections[deviceCfg.deviceID]">
<tr ng-if="!connections[deviceCfg.deviceID].connected">
<th><span class="fa fa-fw fa-eye"></span>&nbsp;<span translate>Last seen</span></th>
<td translate ng-if="!deviceStats[deviceCfg.deviceID].lastSeenDays || deviceStats[deviceCfg.deviceID].lastSeenDays >= 365" class="text-right">Never</td>
<td ng-if="deviceStats[deviceCfg.deviceID].lastSeenDays < 365" class="text-right">{{deviceStats[deviceCfg.deviceID].lastSeen | date:"yyyy-MM-dd HH:mm:ss"}}</td>
@@ -482,6 +483,12 @@
<button type="button" class="btn btn-sm btn-default" ng-click="editDevice(deviceCfg)">
<span class="fa fa-pencil"></span>&nbsp;<span translate>Edit</span>
</button>
<button ng-if="!connections[deviceCfg.deviceID].paused" type="button" class="btn btn-sm btn-default" ng-click="pauseDevice(deviceCfg.deviceID)">
<span class="fa fa-pause"></span>&nbsp;<span translate>Pause</span>
</button>
<button ng-if="connections[deviceCfg.deviceID].paused" type="button" class="btn btn-sm btn-default" ng-click="resumeDevice(deviceCfg.deviceID)">
<span class="fa fa-play"></span>&nbsp;<span translate>Resume</span>
</button>
</span>
<div class="clearfix"></div>
</div>
+2
View File
@@ -63,6 +63,8 @@ angular.module('syncthing.core')
DEVICE_DISCONNECTED: 'DeviceDisconnected', // Generated each time a connection to a device has been terminated
DEVICE_DISCOVERED: 'DeviceDiscovered', // Emitted when a new device is discovered using local discovery
DEVICE_REJECTED: 'DeviceRejected', // Emitted when there is a connection from a device we are not configured to talk to
DEVICE_PAUSED: 'DevicePaused', // Emitted when a device has been paused
DEVICE_RESUMED: 'DeviceResumed', // Emitted when a device has been resumed
DOWNLOAD_PROGRESS: 'DownloadProgress', // Emitted during file downloads for each folder for each file
FOLDER_COMPLETION: 'FolderCompletion', //Emitted when the local or remote contents for a folder changes
FOLDER_REJECTED: 'FolderRejected', // Emitted when a device sends index information for a folder we do not have, or have but do not share with the device in question
+36 -4
View File
@@ -165,7 +165,7 @@ angular.module('syncthing.core')
});
$scope.$on(Events.DEVICE_DISCONNECTED, function (event, arg) {
delete $scope.connections[arg.data.id];
$scope.connections[arg.data.id].connected = false;
refreshDeviceStats();
});
@@ -209,6 +209,14 @@ angular.module('syncthing.core')
$scope.deviceRejections[arg.data.device] = arg;
});
$scope.$on(Events.DEVICE_PAUSED, function (event, arg) {
$scope.connections[arg.data.device].paused = true;
});
$scope.$on(Events.DEVICE_RESUMED, function (event, arg) {
$scope.connections[arg.data.device].paused = false;
});
$scope.$on(Events.FOLDER_REJECTED, function (event, arg) {
$scope.folderRejections[arg.data.folder + "-" + arg.data.device] = arg;
});
@@ -625,7 +633,15 @@ angular.module('syncthing.core')
return 'unused';
}
if ($scope.connections[deviceCfg.deviceID]) {
if (typeof $scope.connections[deviceCfg.deviceID] === 'undefined') {
return 'unknown';
}
if ($scope.connections[deviceCfg.deviceID].paused) {
return 'paused';
}
if ($scope.connections[deviceCfg.deviceID].connected) {
if ($scope.completion[deviceCfg.deviceID] && $scope.completion[deviceCfg.deviceID]._total === 100) {
return 'insync';
} else {
@@ -643,7 +659,15 @@ angular.module('syncthing.core')
return 'warning';
}
if ($scope.connections[deviceCfg.deviceID]) {
if (typeof $scope.connections[deviceCfg.deviceID] === 'undefined') {
return 'info';
}
if ($scope.connections[deviceCfg.deviceID].paused) {
return 'default';
}
if ($scope.connections[deviceCfg.deviceID].connected) {
if ($scope.completion[deviceCfg.deviceID] && $scope.completion[deviceCfg.deviceID]._total === 100) {
return 'success';
} else {
@@ -657,7 +681,7 @@ angular.module('syncthing.core')
$scope.deviceAddr = function (deviceCfg) {
var conn = $scope.connections[deviceCfg.deviceID];
if (conn) {
if (conn && conn.connected) {
return conn.address;
}
return '?';
@@ -702,6 +726,14 @@ angular.module('syncthing.core')
return device.deviceID.substr(0, 6);
};
$scope.pauseDevice = function (device) {
$http.post(urlbase + "/system/pause?device=" + device);
};
$scope.resumeDevice = function (device) {
$http.post(urlbase + "/system/resume?device=" + device);
};
$scope.editSettings = function () {
// Make a working copy
$scope.tmpOptions = angular.copy($scope.config.options);
+4 -4
View File
@@ -5,7 +5,7 @@ import (
)
const (
AssetsBuildDate = "Wed, 19 Aug 2015 20:10:12 GMT"
AssetsBuildDate = "Sun, 23 Aug 2015 19:54:43 GMT"
)
func Assets() map[string][]byte {
@@ -50,7 +50,7 @@ func Assets() map[string][]byte {
assets["assets/lang/lang-zh-TW.json"], _ = base64.StdEncoding.DecodeString("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 truncated
assets["assets/lang/prettyprint.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/1xSUY7TMBD95xRWvrISuQASEiQsCxSVKpuF79nGm5g442hst9oijsNJuBgzdtSW/eq892bGb15zAFIWcNiRDuF5IYNBvVW/iseheFPU0Q5ABrB4XeyBiQYC2BW+O4DVuDdXvCq/rxzeSI8X6aT3I4NeM7jTNKdxbQWR1pMAZHCLgzV+TLC6qy+MKh/QBN2rjcGhd7Ns1rL5fgFcJ3x1e39hVMmFSRaeDNMfDa6NTySQ2GJGVfP+TKiyAYQeZGyMTH+KeL7eBCY+85EZ/pSjvwA/p71mPLlq0zK1caQlhvQri6zMfTVhjOwsjeIjM1tHRz0woWo3zX//WBEkkg8xJGuI/3Vtn9GRl6wW6dq5NaolVHWbCApxiGxGlTXBydibrO66F2quIenkqvYb662bkztVrlUSJYI2ep9t+4Pke9R9fjhIkF2kKcM4MXyYiFPP7aexarby748G07tSpL2sdD+ulQ7MUb6X36/+AQAA//8BAAD//5YJ/N+MAgAA")
assets["assets/lang/valid-langs.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/yTMvQ6CMBTF8d2nIJ29j2CiEOOgUVNJHIxDgQqVppC2dPDpvacsv38/kpOUL5Kyprso14diV7xE04utaFVmz3/atSbfAtNpRlvgMnQq0ZCh44P7McBnqDpwh4UxkfliaZzoLLkWL64BWHRYnHGaI5Vy7b3m+onkDcVOSEzE/DIyv4Gq69r6Kd6bPwAAAP//AQAA//8bXi5E0gAAAA==")
assets["index.html"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/+R9b3fbtpL36yefAlGf1PbZUGrau727ru27qd1sfW4S58TJ7vZ0e+6BSEhCQpEsAFpRXe9n3xkApEgK/Cs5TbM998YiCQxmfgAGg8EAOHl4cXX+5qdXP5CFWoZnD04eet6DyYScx8la8PlCkcPzI/L1V0/+Qt4sGLleR75a8GhOnqZqEQs5hsSY/s2CS3Idp8JnkDdg5FkslgTeyXT6jvmKqJgoIKCYWEoSz/TDi/g3HoaUvEqnIfeRzHPus0iyx+RmTL4efzUmlzNCiQ/M5HlePScrKkkUKxJwqQSfpooFZMXVAhJAiTMessdI7Kc4JT6NSDxVlMOfiBGqQE6VHE8mS1P2OBbzCdCcQGmT8YMHngcYIBQkpNH8dMSiEYnmHk2S05HMhNev/DhSIg5DJk5HOSzn+csR8UMq5ekIk4YxfT9CwowGZw8IOVkyBWItqJBMnY5SNfP+ZbT5gCx67NeU35yO/st7+9Q7j5cJVXwaMiALRbAIcl3+cMqCOSvki+iSnY5uOFslsVCFpCseqMVpwG4AXk8/PCY84orT0JM+Ddnpk/FXW4QCJn3BE8XjqEBrKxnVLWErRcij90SwEHCDz8pPFeE+UloINoNcEkSXE76cT2b0Br+ME0D27AHmVVyFDEGe8ig4HWG1XmjmX0KJh0fkn8gB+X3TGA9GZycTnWdTsinlhkVBLCbTOFbQVGgy8aXcPI2XPBrDm5HlU61DJheMqVGVjuV2BiJOBOC1outuGS0DmNGjKybjJdM8FF/0ZgMJxDdMCA5VVJfzZGJa24OTaRysNSXo2+RNnJApFQQbOr6L6E3eUukNfjF/PAUJ7c+AzWgaQoOCps10Oj6nulkgWSAS8JwItgLobdABzDf4KhPohKUyvKmgUQC1BtWffQnjeTwiUviltoFvPWg//DekG47lDfS+BUPNdDr65usRMU179OTJX0cTaAVYVl5wUilVsQ/Q/3kQsMj7IE0vNgluD+xruTw4TpO5oAG7jGYx+fJLUngcR2zFxN3o7Pa22ibv7k4mSV5yGhaKzmAs/NSqNUdIVzJyw6GO20ov5IJ8oPxUHBG1TqBizEOueaYqysrDn/B/LxF8ScVa/5ZLiwD33+fFHh6V6Fdqb0bJjHpUiHjl+Vz4IfPSZJTB/mU0lcl3JgN0r0iGVLHNL++Ghin8y4SEpgOY3xZlwxRS3QG2b81baKnk9pFN/eiuXLWas4mRt4DiJOR9MV3Sd7F4uTOwAYwWTNTj+gKL+czAtXwHIk6CeAXw4JCZ0jnzJAthzD+rzbLpg6UyqVVzdogOYl+O80EXWr+acBxeJ/OUj3GMHhFFxRxH0H9Moez37eiC6n/fDOnZjyxMXHjQPlA4xfpiVE0HSnY+x0E9oIrahyIVhwR+PG8R4KmPqlnaNGUUfCpwcLDfSkKVtFbO4JJFaRVWED6XqdjUWcDVNVMKKktiU3dwP1t1kyEjU2C0DHojIzwwmrmRiV+FD3ZqGx+LeEUuL9rYyGHjNzAki1EfZuUiVQh1I7NJDArKi2ezVn4NsWG4CVASVKhGTiATJFu08PHaUNoPblmqGy7RBK6qjftQHZpmHQSDlYimWu5zVWXSWD90GqfNtQMmn1Be3KYhkM59tmka3NDIZ0GbFpBtjFo6DbyeTNLQrZk3X04mIIS2gCcwbBu7t8ZkNenRUH5FIxYeE9uSyUvGAphmWrPZErDmxUOgMOPzywhnJLmSh3F8YwOXigu9ZeA9+bpo/xW+J1gw0f96KyoirqdFBYmrabHWA53qZPFN+YueFDnrgH2Ax6W24q21sRkW3J3ZQpDXxeKbsxzYet5w8lEdQJICcfQqGPhSobkhC5jdTxmLiKQ3gDjYIXqyT2FYu4EcwbjghVimUhGrttDFkCXSrgIwl8ukxwUTvdQu6tmfwVyxYhp2MA6NGWgMQzN3Ikkahtbsd2vcqp7YrrIhqreiaqpG3VbbDEGBzPiHkaNqyy9Kj4UH+3OrH4GJTcyovN2HBEsYBVV8aDwUjwmDabM6Ijwi5s1rhj4ktGr+yN5VRq2mq1WrEXRnpNC9YWw8baajawXFQpTz7zXVucHNXaPQC/u1aGeH3G59SxqGMM01VTFWfMnI7ygCOx6t4T/vxQsvCMiPPx4vl8fogLi7OwYGdS5nS66fsxgscMpiaxtojbZS0SCAxi91MsMT4jm2rzHL9ghu29vtI0P30R05vH1kczy6OyIrGimJagPgj6CBjclTkAnVhsnwN5ck1QoYplHIpqfVdsaCytjCtIcGkqnvMynL43MA7crAc3lhu922DnJqIX/B/DbzB2Css35cGqinRtVT7ZK9P49iYZUEy2z/XkJh+24zRi51KfcoV+Zl2wgWcLnk0vqZciXYs77C2H/fahI+h39EH9nuY3x4FodgaTaMD+/Zujg4zHR69+AAVgG+/iTHCJdJrEUZndVUQUWFZnanySV/LihE8+qX0dkG0F40m0heL6hgDUQ/y9FIu3dnPMr0SgEY2w+PnAOWQa06Xpm37uGqME7lI5PUkNtco9tH5teju9F4q5futZLNSpp+97f9tclseG0g/KcdUE23eBoFGsDDLfEfk+2WM+qE2p9iVHaAotuugeU/uVps958OwHwMXHSF/RHj+rPy+NURms9q1I+Vc0aIVc+EiMVzLmF2PA5ZNFcLcka++vzcKwaDvbhVCrYSoIcmUgFE5NOOo/C2fRAtjKHk9nYmOIuCcG16sTxEEpp4eeXT3Ug+tltFjwU/IHeym2uli5q4+vsn41N5xoX2e83TkAqC1m65B5W6SEZPZzSGRAgNghziCn/IZmBL57mdXenbpp7kzUWcJiPCg1xZ1yQvuu9PsJVX8DW8yVJHWIgOncF25qKezXqBNZzyuULWE+pNhFKPL6/LARwhTWS2XJfAqIHhLl9kYmfLfObZu739/2A1sg9oHOrIDKCQChmLY5LEPNpu/y5OEhHPRTauykW8ymS6VlSl8tA8HJHTU3KA6x06GkZHLCklPFusjpE4hk6MKV4x4QPfdM5s5jEPoA8/cjRPzVI3P5d7ucSgX1jttZUL6iQr+u6umdKmgxMM3/CyrOf4ORMfIUZ8Vlz5CzdCDo6zkvKc3mrBotNRGr2PtpdfC3Ejmzb71iQtaXZHc//yi3/969d/+S5v2q4Bt4kfbUkF3Rgyae+XIwmqI+nG0LVJes/8+DQyA3kHhmza++WIB1uGgbu+EpzlXcDPe0bI6AZnL6j0ODdqJn99sYQcNuuXIxevPaWIUxXPsJAu0F6lCoNGkfP9YFtnKJedHg77xyr2zRBZGhtK2jUbY0g+2LSPEQ5bUCdUFOTLkpoH/S+GrgYYZhvYZ4yi1d3ZVREqCx90fRPuD/hpUb/ya0GIExa12FzWXnlF1SKvHKBcW2iQi4tjhZ3q56NNAmTQWlVBjTyTOoFA0mxasowDFv6cN+1fxjy6oSEPyO+/k61v2kKu6XQtIBVnEFA/NJqHbdEq2uLdBaf+sg2GcxAm8zCetoHw75CGhgRHf7ZXLOaa8DMeMgnzJhqu6Fq+TJdTBiBUvWFnXLFlZso+Jv9TS+77tdLkpjyiYn139/3HhHMRL9vQfB779wJmiHT3hqWmti8oazt6xFhgWEY/xCDE/TBOAw8jtMKYBm0Tzu0BrD/2NakJqQlGi1cY5lEYup3Vt4FiD7WHxByVR2sl3a1era91LGCSdxWFa4wIPqyZVMGsKrc5DlALLqh8RkFwI30BJvcEo7VBNPiJakZEXTq5LKDa2Cpw1q+jGHVEjK4kbFQzQ0ZXDqHwP6K3GYAtOhUYWJMmOgM6CsbaPVAnW5DBWovMaD/N0hCvNEwjRkkVGE9htVm6weQlFAc0OAvwGwvVFrIASnSgCHZ2eLdm6juCsgDcMuFRBHUxi4XZGIXuuCnDaMVueD/cF+DbTTPnjXow/ZasblmyHZ9OHbLSH4d1JPR3dzMmX1C58XrvVaNWyvuJyXvFbdta0xEKYCyDfNF2kGwnHNka5gPwui3MzERDkKywzwDODEgDIu5THIbgkkep9OSvKRWsdQUmgxGK41IW4vY/AyQFQ7/MJXo6YRZxTR6ekm8H2k2dQx9xv2dW4h5mjBURwLyR+8EmFqiKAJED3AkXLw+G4SJxn2eL1oPRgbxKw5BciWAHvbftYDVCtLa7qhPHCFz01LzWb5qbZB01GiYLOmWK+0WKT/O3w6jqZS8mlV5oKfnB7AezBDOMeIg7Dxy0n5v3u5DGenFQvtKvdyGMWw8dhF/q110I76fb2B1raCXhKuGwToMbxGWrZtb95j/y8vbZb7pKUVcZwKRcgF4q1sQbfEfOIbWb8b4dQNH5nOGiQ8mXb1/uqQy+THDzW6EA/WY/1KEGwDChYZH+D/ZdvxI+pktGr954NGzT6jpmJSAYV7PLMKeLs3Eom8W0e5hgb+bXsjRbo6hUoC7ak4yx2+KJA4Mn2gsMHG6NiNHqDDh6zXzGbwr7XfZuj+FCKsYHdhUcrI9/I+3JqcrCOg4cYR0HztDDLd5qwvrqS4WpCFO4hvA2wbJrIs06lNS5oAvzo72g7gijA4pKC3Z99e1ZW8B79xoLfMD1me0VJ9c6fbcYG520d7C9CbPBWJGiVyY7gqLketiqxUqQQsGdlvf55qn/rpvkz64sn+Rca4DauU9dsF9tRIKb3d1CA82Mo6SRc2BN/MfPB7i4fPCYHNhlePyZxQgc4JpNwD5czZwuzSNyRrwnXVaBe245A54bFnNrgd0ZLtxzXh6+uguXsMjnYduaGhQwRLLaRtYtMsyQ2F5H7hNB1q3d7qW9Pg1DG77V5YyLXrN5IO06jmEb9x0FyUO4u0iQhGn73uWgdquE63SNcppOzeRkIarRDHI5mmQJimGD1lFtd8Rt4v90eygHABqHNpfZbryuwYF9Yv1sFGlLrF+fSD/Line truncated
assets["index.html"], _ = base64.StdEncoding.DecodeString("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 truncated
assets["modal.html"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/3RST0/cPhC9/z7F/HLogkQ2gDjRXaoWqVIlKiHBpceJPUlcHDuyJ9BtlO/eibNNYbUcEv97783Mm9lo8wzKYozbrPUaLVSoKQPG0jhNv7ZZfpGBq3NkDrlGxrxE9aSD77bZMAjVR4JPwKEnuIZVZGSjVjCOB6wn2pUeg06sL95bQneS2KcT+OY/gM3/eS5LUcCt73bB1A3Dye0pXJ5fXMFjQ/Cwc4ob42r43HPjQ1wn+Mx5bEyEB98HRcLXBF99aEHuYl/+JMXAHlhEmEIbwVfp8N3/NtYi3PelNWoWujOKXKQzeF7D5fp8Dd8qQFCS0sK6v4MXjOA8gzaRgyl7Jg0vhhsBSMzKWDqb5X74HhQ68CWjkcURIEPD3F0XRTvHX/tQF6JaSLxiKirPkyGHzcm1QevrZO3+fljNL7ZeXYPFUNNs5jG28o7J8f79GKIh6X4AtBR4/ufDMPW0j+O48ITZXL0lsmFLrwACiZ1ULYmaapsZCZ39ZVQoQya60+Wkuikm6GvuMCS9cfwXsGiulrQLyfv9Gkqvd8khDuiisr2m95n7/NIgZm91Ku9lVl4XLV1m74B3HW2z+bBwSnYgX66pwt5y2sc2gzT8MiStWZSP2PTGGTYtxcWWD66M3ccZliqyyHRzOyV8aNymmJM6Uu6y3W/2yx8AAAD//wEAAP//qvxG6f8DAAA=")
assets["syncthing/app.js"], _ = base64.StdEncoding.DecodeString("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")
assets["syncthing/core/aboutModalDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/1SOMQ7CMAxF954im1upSnc6cQBG2ENqWktOglwHhFDvTgpSgT/+/yw/F8fMTmxIQ2asYX5ErxPF0fokCE1lSuxAgl7pVgB3TlkPaXAMrbnkQlOKpm7M842uEdQs8af4lLMKed0Z2EP7NymGKzvFo3BZN4NuNei+/06EdztpYNiul75amr56AQAA//8BAAD//xLf4CHFAAAA")
@@ -59,7 +59,7 @@ func Assets() map[string][]byte {
assets["syncthing/core/basenameFilter.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/2yOTU7DMBCF9z3F0I1tCRx1XXySpgvTjBNLziTyDxIiuTuJg4QNvNVI75tvRlOfnPZynLrkkLPwQY84WOrlY/LIxAm2SGNdRM/Zmw5IekT2DCZtoJ0IuIDPTO3xGJOnorQ0p1gSe6z5LkApBYk6NJawExVU6M7na1W9aw+z9jGAguyRYXY28ubWNm17b8T1z7mng1+WY1E6pD4O8AqX388Vd7O7dq2nf7isvFXiF7jcfzbXY1y3x74AAAD//wEAAP//1ZQ6AXEBAAA=")
assets["syncthing/core/binaryFilter.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/6SSTU7DMBCF9z3F7GxDZUrFLjJLWKAewsTjdiR3jFxbokK5O0lTJIMa/jKbRJrvPX+LsbwtwSa9j64ElOJw5DbviLe6jQmFWkA/2lPImKR4JrbpKJbgS49RZJAK3k7MMAlzSVwtiV9KrolhyJ8XYIyBwg49MbqvWFUoViCaT8tuovEeblfrO7iqP5eKR/rGXMCbKYtTRuf4QK/opMOW9jYcxoeXsFYKrkHAI/1H9beOM+U2f5P70WqmztP3Oueujc07nWJ/KB/3NGSrZDf+dqpZvAMAAP//AQAA///Yhw40zwIAAA==")
assets["syncthing/core/durationFilter.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/3RUTW/aQBS8+1dMV6rsAAE7iVBlQnpoOeTQ5JBjFFUbvMYuthftB21K/N/7FnAwBS+S9TDzZmbnPTHq9TCX1VooA15KWxnIFFrQu0TDSGij8mqBVKqSG7AEGUpoht+5yaQ1+CuUxJoXVmgPPayUmOc6lxVKqw1eBWQlHKWf+AP4mXuU7qH9IBEpt4W5cH2zP7xcFSJ29WYTXUXhVRiG1++JVdwQXV3DncvLO0Q3YZggGme4CUtc666WmJWM2k5auvHZCX6P/R/THIe9jTKv1xt5vFrYgqthKRNbiMDXb9XcZJTdcC6V8OmWdIZpXhihAr8hpChSS0CXWHCBjddQ+1aLbfhz40+8j9drrvA0+/b48P3p5/0DptiwhMX4MibHA5C7GNfjbVlSOaYCTFMV1ZMPDiWMVVVLN69W1gwOs2v7aESV0DQrEmRscvRjniL41NnqzmEnps7McXt9TOacEGzFlRb3lWmsReHFcRvtIwLna0k9rUTO6TuYI92RjQ7g5+UL3kHUGI3wg5tsmBZSKu+Ewd3R4I6gZ+h3kW7T6dMF6dMnuT6WkxNofZ66FdAUy26N7dj2Ul+bIga7jViHHkRBa3Seb5f15ymOAjlnuvvb3hN7niklVUyctOx0GwOr+UIMuv8PnOPH118EHS7Fmw7aI+yDvbTWZL+6Na3APwAAAP//AQAA///R6NJhrwQAAA==")
assets["syncthing/core/eventService.js"], _ = base64.StdEncoding.DecodeString("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")
assets["syncthing/core/eventService.js"], _ = base64.StdEncoding.DecodeString("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")
assets["syncthing/core/httpErrorDialogDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/1yOwcrCMBCE732K3LaFkt7/nn7QR9B7SNd2YZOU7UYR6bubKhR1jjOzO5+LY2YnNqQhM9aw3KPXieJofRKEpjJFdiBBr3QthUl1PookOZDjNEJrLrmcUIqmbszj1d8kqFnih/E2FxXy+mfgH9qvSDHM7BRPwiXdMboNo/sZPRPe7KSBYX+x9tXa9NUTAAD//wEAAP//F1ZQpc8AAAA=")
assets["syncthing/core/httpErrorDialogView.html"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/0yQsW7DMAxE5/orCC2ZmvyA7aXoXqBfwMgXW4AsqSQNJEjz75VcFM0kvLvDiWS/5okjhWlwi1l5F8niSI1t08FNnGZUDj6nweHqI69sIadXH8RHOLJgEYO73w9vOSX4ZtLecqBvMuGkkQ2Phxu7l778KxWJPm/J2xLSTAqsSpbpDMK1QAKSbwZTkXyOWNvrodrEW96EBF8b1I70EcGKyheBLmQLqPAMyi1TVxF7+ihcfgN/pRANanqs053K2PWn/SBj9wMAAP//AQAA//+4f+ClGQEAAA==")
assets["syncthing/core/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==")
@@ -79,7 +79,7 @@ func Assets() map[string][]byte {
assets["syncthing/core/selectOnClickDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/3SQQWvEIBCF7/srPBRiIEjPXXooe2+hPZYeRKeprJkpo2YpJf+9atLdJWzeSZ/z+Z5q7JPXrAayyYNswg+a+OWwV4YYmnYnspR1DCa6sQyAz8sXPHhnjk0nPlMGHKGQdyeHlk6t+K1QEUNMjFdGkXd4fLjigqFv6ES+dwCMndAxcmhXUNEyoQhlY1bx8hZQNGoWc+cS9iiWlqqH+PZvy3a/yXL+IcicJZNqumHQEV6LvcVVRs2pz2ThQBgzGuTygvf7jw3y3FQxDDTCk/c1KWxFXQBt7Vyqpt8Yn1bedN5N+105/AMAAP//AQAA//+SF+4JDAIAAA==")
assets["syncthing/core/shutdownDialogDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/1SOwQqDQAxE737F3qIg672eCv2F9r6sqQZitsRspRT/vdqC1DnOTDIvSJ85qB9TlxlLmF4SbSDpfUyKUBVule9IMRo9t8KQrUuzXChw6qF297xeUBJXVu79rW9StKzyZ/zMyZSinRycoT5EhuODg+FVeU13imajaI6bN8LZDzYy7B+WtliqtvgAAAD//wEAAP//3qFOo80AAAA=")
assets["syncthing/core/shutdownDialogView.html"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/0TOTaqDMBAH8PXzFMNsXL16gZhNj+AJ0jjWQJwJzgQp1ru3lkK3P/h/uEXGkCGNPepcbZSNEdSCVX1LjZFUEVIU7rHIRuu/TBOCJcvU4763wzcFV1lKJqMWnmBrYM3B6DjQN3+u/MQPD442J77DHBRuRAznMpwlF9cV37juc8o3LwAAAP//AQAA//99X8KxnQAAAA==")
assets["syncthing/core/syncthingController.js"], _ = base64.StdEncoding.DecodeString("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 truncated
assets["syncthing/core/syncthingController.js"], _ = base64.StdEncoding.DecodeString("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 truncated
assets["syncthing/core/uniqueFolderDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/7SSwW4yMQyE7zyFD7+0IK3CHc5/b1V74h5tvKzVkIDtQFHFuzdhUaGwtJWqzgVp4vkYW2vDMnnLZhVd8jiuZB8a7SgsTRMZq8kIsowjxkZpmwdSoE3Ch+gdclVDm/I8xQDjCbwdh4sYNXG4MHpzkzJnBlVYPkaHvqo/vXsKL7MLoDRxjTWgX9VgVVlqaJT95ApbVHzzb21ZkMWkIB21Oj6jtoS7hfUJh8JF1J7+z6Ajzev/fyUpv/cCRdMp7BCki8m7UClsrSdnFe8G+pqCuiiTpPubcyrnjvNBwCFfQvCiaXsMiemsPO3CM2ePM/K86zfdtUPoGYBlWwHrGa3b/6J/a3PHrxf4aScS6OF/dM5B9/ThftzwNnu44p05h/moPL4DAAD//wEAAP//r65WJ1IDAAA=")
assets["syncthing/core/upgradingDialogDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/1yOwQrCMBBE7/2K3LaFkt7tSfAX9B7SNV3YJmW7UUT676YKRZ3jzNudcTFkdmKnNGTGGpZH9DpSDNYnQWgqU2QHEvRKtwLkOYgbCnAixylAa665nFCKpm7M881vEtQs8cv4mIsKeT0YOEL7EylOMzvFs3BJ9xndNqP7K70Q3u2oE8P+Yu2rtemrFwAAAP//AQAA//99zQ2GzwAAAA==")
assets["syncthing/core/upgradingDialogView.html"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/1zOTarDMAwE4PXLKYQ2WSW5gO0zPCg9gHDcVODaxlIIJc3dm5b+QLfDN8yYSx4pAo8W5zJVGjlNCKKks1jkdMoI7HOySLXmpfNcfQzdXBCUNQaL69oe380WbqCVkkTSsG3omj9TnJFC6Zu7wzV5Pe8cWOCz2pvh4Rz88v8YSAIsxPoifb/j4hozPN+75g4AAP//AQAA///kaeW6xgAAAA==")
+6
View File
@@ -25,6 +25,8 @@ const (
DeviceConnected
DeviceDisconnected
DeviceRejected
DevicePaused
DeviceResumed
LocalIndexUpdated
RemoteIndexUpdated
ItemStarted
@@ -78,6 +80,10 @@ func (t EventType) String() string {
return "FolderCompletion"
case FolderErrors:
return "FolderErrors"
case DevicePaused:
return "DevicePaused"
case DeviceResumed:
return "DeviceResumed"
default:
return "Unknown"
}
+46 -10
View File
@@ -87,9 +87,10 @@ type Model struct {
folderStatRefs map[string]*stats.FolderStatisticsReference // folder -> statsRef
fmut sync.RWMutex // protects the above
conn map[protocol.DeviceID]Connection
deviceVer map[protocol.DeviceID]string
pmut sync.RWMutex // protects conn and deviceVer
conn map[protocol.DeviceID]Connection
deviceVer map[protocol.DeviceID]string
devicePaused map[protocol.DeviceID]bool
pmut sync.RWMutex // protects the above
reqValidationCache map[string]time.Time // folder / file name => time when confirmed to exist
rvmut sync.RWMutex // protects reqValidationCache
@@ -131,6 +132,7 @@ func NewModel(cfg *config.Wrapper, id protocol.DeviceID, deviceName, clientName,
folderStatRefs: make(map[string]*stats.FolderStatisticsReference),
conn: make(map[protocol.DeviceID]Connection),
deviceVer: make(map[protocol.DeviceID]string),
devicePaused: make(map[protocol.DeviceID]bool),
reqValidationCache: make(map[string]time.Time),
fmut: sync.NewRWMutex(),
@@ -217,6 +219,8 @@ func (m *Model) StartFolderRO(folder string) {
type ConnectionInfo struct {
protocol.Statistics
Connected bool
Paused bool
Address string
ClientVersion string
Type ConnectionType
@@ -227,9 +231,11 @@ func (info ConnectionInfo) MarshalJSON() ([]byte, error) {
"at": info.At,
"inBytesTotal": info.InBytesTotal,
"outBytesTotal": info.OutBytesTotal,
"connected": info.Connected,
"paused": info.Paused,
"address": info.Address,
"type": info.Type.String(),
"clientVersion": info.ClientVersion,
"type": info.Type.String(),
})
}
@@ -242,16 +248,21 @@ func (m *Model) ConnectionStats() map[string]interface{} {
m.pmut.RLock()
m.fmut.RLock()
var res = make(map[string]interface{})
conns := make(map[string]ConnectionInfo, len(m.conn))
for device, conn := range m.conn {
res := make(map[string]interface{})
devs := m.cfg.Devices()
conns := make(map[string]ConnectionInfo, len(devs))
for device := range devs {
ci := ConnectionInfo{
Statistics: conn.Statistics(),
ClientVersion: m.deviceVer[device],
Paused: m.devicePaused[device],
}
if addr := m.conn[device].RemoteAddr(); addr != nil {
ci.Address = addr.String()
if conn, ok := m.conn[device]; ok {
ci.Type = conn.Type
ci.Connected = ok
ci.Statistics = conn.Statistics()
if addr := conn.RemoteAddr(); addr != nil {
ci.Address = addr.String()
}
}
conns[device.String()] = ci
@@ -956,6 +967,31 @@ func (m *Model) AddConnection(conn Connection) {
m.deviceWasSeen(deviceID)
}
func (m *Model) PauseDevice(device protocol.DeviceID) {
m.pmut.Lock()
m.devicePaused[device] = true
_, ok := m.conn[device]
m.pmut.Unlock()
if ok {
m.Close(device, errors.New("device paused"))
}
events.Default.Log(events.DevicePaused, map[string]string{"device": device.String()})
}
func (m *Model) ResumeDevice(device protocol.DeviceID) {
m.pmut.Lock()
m.devicePaused[device] = false
m.pmut.Unlock()
events.Default.Log(events.DeviceResumed, map[string]string{"device": device.String()})
}
func (m *Model) IsPaused(device protocol.DeviceID) bool {
m.pmut.Lock()
paused := m.devicePaused[device]
m.pmut.Unlock()
return paused
}
func (m *Model) deviceStatRef(deviceID protocol.DeviceID) *stats.DeviceStatisticsReference {
m.fmut.Lock()
defer m.fmut.Unlock()