mirror of
https://git.cloudron.io/cloudron/syncthing-app
synced 2025-09-13 08:19:09 +00:00
Compare commits
35 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
4af07bb9b9 | ||
|
303a00f082 | ||
|
c3533569c1 | ||
|
06a75583e8 | ||
|
b413b5d43a | ||
|
5377c0180c | ||
|
f3a6e7b69e | ||
|
7620eec7b6 | ||
|
2d4e328955 | ||
|
ef3a205467 | ||
|
9400c1a99f | ||
|
ff751142d4 | ||
|
2032c881a5 | ||
|
692c124a61 | ||
|
70c159edbc | ||
|
d7a7febb91 | ||
|
9fff5574cb | ||
|
cfc7133606 | ||
|
ef92705074 | ||
|
baf46b3f52 | ||
|
3d8ea24781 | ||
|
37558f3b10 | ||
|
0e8b61d7d4 | ||
|
e628a70b60 | ||
|
02e9dbdedc | ||
|
3e83a29587 | ||
|
bbe4721c76 | ||
|
37b6969e24 | ||
|
92ae28d0da | ||
|
5e085fc42a | ||
|
d1c449aef8 | ||
|
831efb6f8c | ||
|
012db8bad1 | ||
|
4e805ba62f | ||
|
13de61d86e |
31
CHANGELOG
31
CHANGELOG
@@ -3,3 +3,34 @@
|
||||
|
||||
[0.1.1]
|
||||
* Huge speedup by caching ldap
|
||||
|
||||
[0.1.2]
|
||||
* Fixed wrong URL
|
||||
|
||||
[0.1.3]
|
||||
* Updated postinstall message
|
||||
|
||||
[0.2.0]
|
||||
* Upstream version 0.14.29
|
||||
* Uses syncthing generated config (thanks to @rymnel)
|
||||
* Fixed typo in manifest (thanks to @rymnel)
|
||||
* Running under user cloudron
|
||||
|
||||
[0.2.1]
|
||||
* Fixed description
|
||||
|
||||
[0.2.2]
|
||||
* Add to sync category in app store
|
||||
|
||||
[0.2.3]
|
||||
* Updated to version 0.14.30
|
||||
|
||||
[0.2.4]
|
||||
* Updated to version 0.14.31
|
||||
|
||||
[0.2.5]
|
||||
* Updated to version 0.14.32
|
||||
|
||||
[0.3.0]
|
||||
* Updated to version 0.14.33
|
||||
|
||||
|
@@ -5,7 +5,7 @@
|
||||
"description": "file://DESCRIPTION.md",
|
||||
"changelog": "file://CHANGELOG",
|
||||
"tagline": "Decentralized file synchronization",
|
||||
"version": "0.1.1",
|
||||
"version": "0.3.0",
|
||||
"healthCheckPath": "/check",
|
||||
"httpPort": 8000,
|
||||
"addons": {
|
||||
@@ -21,11 +21,12 @@
|
||||
}
|
||||
},
|
||||
"manifestVersion": 1,
|
||||
"website": "http://www.synthing.net",
|
||||
"website": "https://syncthing.net",
|
||||
"contactEmail": "support@cloudron.io",
|
||||
"icon": "logo.png",
|
||||
"tags": [
|
||||
"storage"
|
||||
"storage",
|
||||
"sync"
|
||||
],
|
||||
"mediaLinks": [
|
||||
"https://git.cloudron.io/dswd/syncthing-app/raw/master/screenshots/1.jpg"
|
||||
|
@@ -1,4 +1,4 @@
|
||||
This app packages Syncthing v0.14.27.
|
||||
This app packages Syncthing <upstream>v0.14.33</upstream>.
|
||||
|
||||
Syncthing replaces proprietary sync and cloud services with something open, trustworthy and decentralized. Your data is your data alone and you deserve to choose where it is stored, if it is shared with some third party and how it's transmitted over the Internet.
|
||||
|
||||
|
@@ -28,7 +28,7 @@ RUN ./configure \
|
||||
--build=cloudron-river
|
||||
RUN make install
|
||||
|
||||
ENV VERSION 0.14.27
|
||||
ENV VERSION 0.14.33
|
||||
|
||||
RUN mkdir -p /app/code \
|
||||
&& wget https://github.com/syncthing/syncthing/releases/download/v${VERSION}/syncthing-linux-amd64-v${VERSION}.tar.gz -O - \
|
||||
@@ -37,7 +37,6 @@ RUN mkdir -p /app/code \
|
||||
WORKDIR /app/code
|
||||
|
||||
ADD nginx.conf /app/code/nginx.conf
|
||||
ADD config.xml /app/code/config.xml.default
|
||||
ADD inittab /etc/inittab
|
||||
ADD start.sh /app/code/start.sh
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
This application integrates with Cloudron authentication.
|
||||
However, all Cloudron users share the same Syncthing session.
|
||||
Please note that only the username is accepted as login and not the email address.
|
||||
|
||||
Syncthing contains an internal user `admin` that is needed by Cloudron but not exposed.
|
||||
Please do not change the password of that account.
|
||||
|
@@ -31,7 +31,6 @@ The e2e tests are located in the `test/` folder and require [nodejs](http://node
|
||||
cd syncthing-app/test
|
||||
|
||||
npm install
|
||||
export PATH=$PATH:node_modules/.bin
|
||||
USERNAME=user PASSWORD=password mocha --bail test.js
|
||||
PATH=$PATH:node_modules/.bin USERNAME=user PASSWORD=password mocha --bail test.js
|
||||
```
|
||||
|
||||
|
15
config.xml
15
config.xml
@@ -1,15 +0,0 @@
|
||||
<configuration version="19">
|
||||
<gui enabled="true" tls="false" debugging="false">
|
||||
<insecureAdminAccess>true</insecureAdminAccess>
|
||||
<address>0.0.0.0:3000</address>
|
||||
<theme>default</theme>
|
||||
</gui>
|
||||
<options>
|
||||
<listenAddress>tcp://:22000</listenAddress>
|
||||
<localAnnounceEnabled>false</localAnnounceEnabled>
|
||||
<startBrowser>false</startBrowser>
|
||||
<natEnabled>true</natEnabled>
|
||||
<autoUpgradeIntervalH>0</autoUpgradeIntervalH>
|
||||
<upgradeToPreReleases>false</upgradeToPreReleases>
|
||||
</options>
|
||||
</configuration>
|
2
inittab
2
inittab
@@ -1,2 +1,2 @@
|
||||
::respawn:/app/code/syncthing -gui-address=0.0.0.0:3000 -home=/app/data/config -no-browser >/dev/stdout 2>/dev/stderr
|
||||
::respawn:sudo -nu cloudron /app/code/syncthing -gui-address=0.0.0.0:3000 -home=/app/data/config -no-browser >/dev/stdout 2>/dev/stderr
|
||||
::respawn:/usr/local/nginx/sbin/nginx -c /app/code/nginx.conf
|
||||
|
12
start.sh
12
start.sh
@@ -4,8 +4,12 @@ set -eu
|
||||
|
||||
mkdir -p /app/data/config
|
||||
|
||||
if ! [ -f /app/data/config/config.xml ]; then
|
||||
cp /app/code/config.xml.default /app/data/config/config.xml
|
||||
export STNODEFAULTFOLDER=1 STNOUPGRADE=1
|
||||
|
||||
# if this if the first run, generate a useful config
|
||||
if [ ! -f /app/data/config/config.xml ]; then
|
||||
echo "=> Generating config"
|
||||
/app/code/syncthing --generate="/app/data/config"
|
||||
fi
|
||||
|
||||
cat >/run/ldap.conf <<EOF
|
||||
@@ -19,9 +23,11 @@ ldap_server cloudron {
|
||||
}
|
||||
EOF
|
||||
|
||||
# Set the listenAddress and the gui enabled to make sure user doesnt lock themselves out by accident.
|
||||
sed -e 's,<listenAddress>.*</listenAddress>,<listenAddress>tcp://:22000</listenAddress>,' -i /app/data/config/config.xml
|
||||
sed -e 's,<gui .*>,<gui enabled="true" tls="false" debugging="false">,' -i /app/data/config/config.xml
|
||||
|
||||
export STNODEFAULTFOLDER=1 STNOUPGRADE=1
|
||||
chown -R cloudron:cloudron /app/data/config /app/data
|
||||
|
||||
exec busybox init
|
||||
|
||||
|
98
test/test.js
98
test/test.js
@@ -46,75 +46,71 @@ describe('Application life cycle test', function () {
|
||||
done();
|
||||
});
|
||||
|
||||
var LOCATION = 'syncthing-test';
|
||||
var LOCATION = 'test';
|
||||
var TEST_TIMEOUT = 30000;
|
||||
var SYNC_PORT = 22001;
|
||||
var app;
|
||||
|
||||
function pageLoaded(callback) {
|
||||
browser.wait(until.titleMatches(/[0-9a-f]{12} \| Syncthing/), TEST_TIMEOUT).then(callback);
|
||||
function pageLoaded() {
|
||||
return browser.wait(until.titleMatches(/[0-9a-f]{12} \| Syncthing/), TEST_TIMEOUT);
|
||||
}
|
||||
|
||||
function visible(selector, callback) {
|
||||
function visible(selector) {
|
||||
return browser.wait(until.elementLocated(selector), TEST_TIMEOUT).then(function () {
|
||||
browser.wait(until.elementIsVisible(browser.findElement(selector)), TEST_TIMEOUT).then(function () {
|
||||
callback();
|
||||
});
|
||||
return browser.wait(until.elementIsVisible(browser.findElement(selector)), TEST_TIMEOUT);
|
||||
});
|
||||
}
|
||||
|
||||
function loadPageWait(callback) {
|
||||
browser.manage().deleteAllCookies();
|
||||
setTimeout(function() {
|
||||
browser.get('https://' + username + ':' + password + '@' + app.fqdn);
|
||||
pageLoaded(function() {
|
||||
callback();
|
||||
});
|
||||
}, 60000); //Timeout since, reconfigure lacks health-check
|
||||
}
|
||||
|
||||
function loadPage(callback) {
|
||||
browser.manage().deleteAllCookies();
|
||||
browser.get('https://' + username + ':' + password + '@' + app.fqdn);
|
||||
pageLoaded(function() {
|
||||
browser.manage().deleteAllCookies().then(function () {
|
||||
return browser.get('https://' + username + ':' + encodeURIComponent(password) + '@' + app.fqdn);
|
||||
}).then(function () {
|
||||
return pageLoaded();
|
||||
}).then(function () {
|
||||
callback();
|
||||
});
|
||||
}
|
||||
|
||||
function addFolder(callback) {
|
||||
pageLoaded(function() {
|
||||
browser.findElement(by.css('[ng-click*=addFolder]')).click();
|
||||
visible(by.id('folderPath'), function() {
|
||||
browser.findElement(by.id('folderLabel')).sendKeys('test').then(function() {
|
||||
browser.findElement(by.id('folderPath')).sendKeys('/app/data/test').then(function() {
|
||||
//Clear and re-enter the folder to avoid race with auto-completion
|
||||
browser.findElement(by.id('folderPath')).clear().then(function() {
|
||||
browser.findElement(by.id('folderPath')).sendKeys('/app/data/test').then(function() {
|
||||
browser.findElement(by.css('[ng-click*=saveFolder]')).click().then(function() {
|
||||
browser.wait(until.elementLocated(by.css('#folders .panel-status span[ng-switch-when=unshared]')), TEST_TIMEOUT).then(function() {
|
||||
callback();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
pageLoaded().then(function() {
|
||||
return browser.findElement(by.css('[ng-click*=addFolder]')).click();
|
||||
}).then(function () {
|
||||
return visible(by.id('folderPath'));
|
||||
}).then(function() {
|
||||
return browser.findElement(by.id('folderLabel')).sendKeys('test');
|
||||
}).then(function () {
|
||||
return browser.findElement(by.id('folderPath')).sendKeys('/app/data/test');
|
||||
}).then(function() {
|
||||
//Clear and re-enter the folder to avoid race with auto-completion
|
||||
return browser.findElement(by.id('folderPath')).clear();
|
||||
}).then(function() {
|
||||
return browser.findElement(by.id('folderPath')).sendKeys('/app/data/test');
|
||||
}).then(function() {
|
||||
return browser.findElement(by.css('[ng-click*=saveFolder]')).click();
|
||||
}).then(function() {
|
||||
return browser.wait(until.elementLocated(by.css('#folders .panel-status span[ng-switch-when=unshared]')), TEST_TIMEOUT);
|
||||
}).then(function() {
|
||||
callback();
|
||||
});
|
||||
}
|
||||
|
||||
function removeFolder(callback) {
|
||||
browser.get('https://' + username + ':' + password + '@' + app.fqdn);
|
||||
pageLoaded(function() {
|
||||
browser.findElement(by.css('#folders button')).click();
|
||||
setTimeout(function() {
|
||||
browser.findElement(by.css('#folder-0 button[ng-click*=editFolder]')).click();
|
||||
setTimeout(function() {
|
||||
browser.findElement(by.css('[ng-click*=deleteFolder]')).click().then(function() {
|
||||
setTimeout(callback, 1000); //This needs to run for some time
|
||||
});
|
||||
}, 1000); //No way to check for visibility of angular-js components
|
||||
}, 1000); //No way to check for visibility of angular-js components
|
||||
browser.get('https://' + username + ':' + encodeURIComponent(password) + '@' + app.fqdn).then(function () {
|
||||
return pageLoaded();
|
||||
}).then(function() {
|
||||
return browser.findElement(by.css('#folders button')).click();
|
||||
}).then(function () {
|
||||
return browser.sleep(1000); //No way to check for visibility of angular-js components
|
||||
}).then(function () {
|
||||
return browser.findElement(by.css('#folder-0 button[ng-click*=editFolder]')).click();
|
||||
}).then(function () {
|
||||
return browser.sleep(1000); //No way to check for visibility of angular-js components
|
||||
}).then(function () {
|
||||
return browser.findElement(by.css('[ng-click*=deleteFolder]')).click();
|
||||
}).then(function () {
|
||||
return browser.sleep(1000); //This needs to run for some time
|
||||
}).then(function () {
|
||||
callback();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -152,13 +148,13 @@ describe('Application life cycle test', function () {
|
||||
|
||||
it('move to different location', function () {
|
||||
browser.manage().deleteAllCookies();
|
||||
execSync('cloudron configure --location ' + LOCATION + '2', { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
|
||||
execSync('cloudron configure --wait --location ' + LOCATION + '2', { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
|
||||
var inspect = JSON.parse(execSync('cloudron inspect'));
|
||||
app = inspect.apps.filter(function (a) { return a.location === LOCATION + '2'; })[0];
|
||||
expect(app).to.be.an('object');
|
||||
});
|
||||
|
||||
it('can load page', loadPageWait);
|
||||
it('can load page', loadPage);
|
||||
it('can add folder', addFolder);
|
||||
it('can remove folder', removeFolder);
|
||||
|
||||
|
Reference in New Issue
Block a user