Support pause/resume directories in CLI

This commit is contained in:
Marius Kittler 2017-02-23 17:47:19 +01:00 committed by Martchus
parent 5101872532
commit 189a985e23
10 changed files with 293 additions and 189 deletions

View File

@ -59,10 +59,12 @@ Application::Application() :
m_args.restart.setCallback(bind(&Application::requestRestart, this, _1));
m_args.rescan.setCallback(bind(&Application::requestRescan, this, _1));
m_args.rescanAll.setCallback(bind(&Application::requestRescanAll, this, _1));
m_args.pause.setCallback(bind(&Application::requestPause, this, _1));
m_args.pauseAll.setCallback(bind(&Application::requestPauseAll, this, _1));
m_args.resume.setCallback(bind(&Application::requestResume, this, _1));
m_args.resumeAll.setCallback(bind(&Application::requestResumeAll, this, _1));
m_args.pause.setCallback(bind(&Application::requestPauseResume, this, true));
m_args.resume.setCallback(bind(&Application::requestPauseResume, this, false));
m_args.pauseAllDevs.setCallback(bind(&Application::requestPauseAllDevs, this, _1));
m_args.pauseAllDirs.setCallback(bind(&Application::requestPauseAllDirs, this, _1));
m_args.resumeAllDevs.setCallback(bind(&Application::requestResumeAllDevs, this, _1));
m_args.resumeAllDirs.setCallback(bind(&Application::requestResumeAllDirs, this, _1));
m_args.waitForIdle.setCallback(bind(&Application::initWaitForIdle, this, _1));
// connect signals and slots
@ -139,7 +141,9 @@ int Application::exec(int argc, const char * const *argv)
}
// finally to request / establish connection
if(m_args.status.isPresent() || m_args.rescanAll.isPresent() || m_args.pauseAll.isPresent() || m_args.resumeAll.isPresent() || m_args.waitForIdle.isPresent()) {
if(m_args.status.isPresent() || m_args.rescanAll.isPresent() || m_args.pauseAllDirs.isPresent() || m_args.pauseAllDevs.isPresent()
|| m_args.resumeAllDirs.isPresent() || m_args.resumeAllDevs.isPresent() || m_args.pause.isPresent()
|| m_args.resume.isPresent() || m_args.waitForIdle.isPresent()) {
// those arguments rquire establishing a connection first, the actual handler is called by handleStatusChanged() when
// the connection has been established
m_connection.reconnect(m_settings);
@ -192,6 +196,11 @@ void Application::handleError(const QString &message)
QCoreApplication::exit(-3);
}
void Application::findRelevantDirsAndDevs()
{
findRelevantDirsAndDevs(OperationType::Status);
}
void Application::requestLog(const ArgumentOccurrence &)
{
m_connection.requestLog(bind(&Application::printLog, this, _1));
@ -234,79 +243,126 @@ void Application::requestRescanAll(const ArgumentOccurrence &)
m_connection.rescanAllDirs();
}
void Application::requestPause(const ArgumentOccurrence &occurrence)
void Application::requestPauseResume(bool pause)
{
m_expectedResponse = occurrence.values.size();
connect(&m_connection, &SyncthingConnection::pauseTriggered, this, &Application::handleResponse);
for(const char *value : occurrence.values) {
cerr << "Request pausing " << value << " ...\n";
m_connection.pauseDevice(argToQString(value));
findRelevantDirsAndDevs(OperationType::PauseResume);
m_expectedResponse = m_relevantDevs.size();
if(pause) {
connect(&m_connection, &SyncthingConnection::devicePauseTriggered, this, &Application::handleResponse);
connect(&m_connection, &SyncthingConnection::directoryPauseTriggered, this, &Application::handleResponse);
} else {
connect(&m_connection, &SyncthingConnection::deviceResumeTriggered, this, &Application::handleResponse);
connect(&m_connection, &SyncthingConnection::directoryResumeTriggered, this, &Application::handleResponse);
}
if(!m_relevantDirs.empty()) {
QStringList dirIds;
dirIds.reserve(m_relevantDirs.size());
for(const SyncthingDir *dir : m_relevantDirs) {
dirIds << dir->id;
}
if(pause) {
cerr << "Request pausing directories ";
} else {
cerr << "Request resuming directories ";
}
cerr << dirIds.join(QStringLiteral(", ")).toLocal8Bit().data() << " ...\n";
if(pause ? m_connection.pauseDirectories(dirIds) : m_connection.resumeDirectories(dirIds)) {
++m_expectedResponse;
}
}
for(const SyncthingDev *dev : m_relevantDevs) {
if(pause) {
cerr << "Request pausing device ";
}
cerr << dev->id.toLocal8Bit().data() << " ...\n";
pause ? m_connection.pauseDevice(dev->id) : m_connection.resumeDevice(dev->id);
}
cerr.flush();
}
void Application::requestPauseAll(const ArgumentOccurrence &)
void Application::requestPauseAllDevs(const ArgumentOccurrence &)
{
findRelevantDirsAndDevs(OperationType::PauseResume);
m_expectedResponse = m_connection.devInfo().size();
connect(&m_connection, &SyncthingConnection::pauseTriggered, this, &Application::handleResponse);
connect(&m_connection, &SyncthingConnection::devicePauseTriggered, this, &Application::handleResponse);
cerr << "Request pausing all devices ..." << endl;
m_connection.pauseAllDevs();
}
void Application::requestResume(const ArgumentOccurrence &occurrence)
void Application::requestPauseAllDirs(const ArgumentOccurrence &)
{
m_expectedResponse = occurrence.values.size();
connect(&m_connection, &SyncthingConnection::resumeTriggered, this, &Application::handleResponse);
for(const char *value : occurrence.values) {
cerr << "Request resuming " << value << " ...\n";
m_connection.resumeDevice(argToQString(value));
}
cerr.flush();
m_expectedResponse = m_connection.dirInfo().size();
connect(&m_connection, &SyncthingConnection::directoryPauseTriggered, this, &Application::handleResponse);
cerr << "Request pausing all directories ..." << endl;
m_connection.pauseAllDirs();
}
void Application::requestResumeAll(const ArgumentOccurrence &)
void Application::requestResumeAllDevs(const ArgumentOccurrence &)
{
m_expectedResponse = m_connection.devInfo().size();
connect(&m_connection, &SyncthingConnection::resumeTriggered, this, &Application::handleResponse);
connect(&m_connection, &SyncthingConnection::deviceResumeTriggered, this, &Application::handleResponse);
cerr << "Request resuming all devices ..." << endl;
m_connection.resumeAllDevs();
}
void Application::findRelevantDirsAndDevs()
void Application::requestResumeAllDirs(const ArgumentOccurrence &)
{
m_expectedResponse = m_connection.dirInfo().size();
connect(&m_connection, &SyncthingConnection::deviceResumeTriggered, this, &Application::handleResponse);
cerr << "Request resuming all directories ..." << endl;
m_connection.resumeAllDevs();
}
void Application::findRelevantDirsAndDevs(OperationType operationType)
{
int dummy;
if(m_args.dir.isPresent()) {
m_relevantDirs.reserve(m_args.dir.occurrences());
for(size_t i = 0; i != m_args.dir.occurrences(); ++i) {
if(const SyncthingDir *dir = m_connection.findDirInfo(argToQString(m_args.dir.values(i).front()), dummy)) {
Argument *dirArg, *devArg;
switch(operationType) {
case OperationType::Status:
dirArg = &m_args.statusDir;
devArg = &m_args.statusDev;
break;
case OperationType::PauseResume:
dirArg = &m_args.pauseDir;
devArg = &m_args.pauseDev;
}
if(dirArg->isPresent()) {
m_relevantDirs.reserve(dirArg->occurrences());
for(size_t i = 0; i != dirArg->occurrences(); ++i) {
if(const SyncthingDir *dir = m_connection.findDirInfo(argToQString(dirArg->values(i).front()), dummy)) {
m_relevantDirs.emplace_back(dir);
} else {
cerr << "Warning: Specified directory \"" << m_args.dir.values(i).front() << "\" does not exist and will be ignored" << endl;
cerr << "Warning: Specified directory \"" << dirArg->values(i).front() << "\" does not exist and will be ignored" << endl;
}
}
}
if(m_args.dev.isPresent()) {
m_relevantDevs.reserve(m_args.dev.occurrences());
for(size_t i = 0; i != m_args.dev.occurrences(); ++i) {
const SyncthingDev *dev = m_connection.findDevInfo(argToQString(m_args.dev.values(i).front()), dummy);
if(devArg->isPresent()) {
m_relevantDevs.reserve(devArg->occurrences());
for(size_t i = 0; i != devArg->occurrences(); ++i) {
const SyncthingDev *dev = m_connection.findDevInfo(argToQString(devArg->values(i).front()), dummy);
if(!dev) {
dev = m_connection.findDevInfoByName(argToQString(m_args.dev.values(i).front()), dummy);
dev = m_connection.findDevInfoByName(argToQString(devArg->values(i).front()), dummy);
}
if(dev) {
m_relevantDevs.emplace_back(dev);
} else {
cerr << "Warning: Specified device \"" << m_args.dev.values(i).front() << "\" does not exist and will be ignored" << endl;
cerr << "Warning: Specified device \"" << devArg->values(i).front() << "\" does not exist and will be ignored" << endl;
}
}
}
if(m_relevantDirs.empty() && m_relevantDevs.empty()) {
m_relevantDirs.reserve(m_connection.dirInfo().size());
for(const SyncthingDir &dir : m_connection.dirInfo()) {
m_relevantDirs.emplace_back(&dir);
}
m_relevantDevs.reserve(m_connection.devInfo().size());
for(const SyncthingDev &dev : m_connection.devInfo()) {
m_relevantDevs.emplace_back(&dev);
if(operationType == OperationType::Status) {
// when displaying status information and no dirs/devs have been specified, just print information for all
if(m_relevantDirs.empty() && m_relevantDevs.empty()) {
m_relevantDirs.reserve(m_connection.dirInfo().size());
for(const SyncthingDir &dir : m_connection.dirInfo()) {
m_relevantDirs.emplace_back(&dir);
}
m_relevantDevs.reserve(m_connection.devInfo().size());
for(const SyncthingDev &dev : m_connection.devInfo()) {
m_relevantDevs.emplace_back(&dev);
}
}
}
}
@ -403,8 +459,8 @@ void Application::initWaitForIdle(const ArgumentOccurrence &)
// currently not idling
// -> relevant dirs/devs might be invalidated so findRelevantDirsAndDevs() must invoked again
connect(&m_connection, &SyncthingConnection::newDirs, this, &Application::findRelevantDirsAndDevs);
connect(&m_connection, &SyncthingConnection::newDevices, this, &Application::findRelevantDirsAndDevs);
connect(&m_connection, &SyncthingConnection::newDirs, this, static_cast<void(Application::*)(void)>(&Application::findRelevantDirsAndDevs));
connect(&m_connection, &SyncthingConnection::newDevices, this, static_cast<void(Application::*)(void)>(&Application::findRelevantDirsAndDevs));
// -> check for idle again when dir/dev status changed
connect(&m_connection, &SyncthingConnection::dirStatusChanged, this, &Application::waitForIdle);
connect(&m_connection, &SyncthingConnection::devStatusChanged, this, &Application::waitForIdle);

View File

@ -12,6 +12,12 @@
namespace Cli {
enum class OperationType
{
Status,
PauseResume
};
class Application : public QObject
{
Q_OBJECT
@ -27,6 +33,7 @@ private slots:
void handleResponse();
void handleError(const QString &message);
void findRelevantDirsAndDevs();
void findRelevantDirsAndDevs(OperationType operationType);
private:
void requestLog(const ArgumentOccurrence &);
@ -34,10 +41,11 @@ private:
void requestRestart(const ArgumentOccurrence &);
void requestRescan(const ArgumentOccurrence &occurrence);
void requestRescanAll(const ArgumentOccurrence &);
void requestPause(const ArgumentOccurrence &occurrence);
void requestPauseAll(const ArgumentOccurrence &);
void requestResume(const ArgumentOccurrence &);
void requestResumeAll(const ArgumentOccurrence &);
void requestPauseResume(bool pause);
void requestPauseAllDevs(const ArgumentOccurrence &);
void requestPauseAllDirs(const ArgumentOccurrence &);
void requestResumeAllDevs(const ArgumentOccurrence &);
void requestResumeAllDirs(const ArgumentOccurrence &);
void printStatus(const ArgumentOccurrence &);
void printLog(const std::vector<Data::SyncthingLogEntry> &logEntries);
void initWaitForIdle(const ArgumentOccurrence &);

View File

@ -11,29 +11,35 @@ Args::Args() :
rescan("rescan", 'r', "rescans the specified directories"),
rescanAll("rescan-all", '\0', "rescans all directories"),
pause("pause", '\0', "pauses the specified devices"),
pauseAll("pause-all", '\0', "pauses all devices"),
pauseAllDevs("pause-all-devs", '\0', "pauses all devices"),
pauseAllDirs("pause-all-dirs", '\0', "pauses all directories"),
resume("resume", '\0', "resumes the specified devices"),
resumeAll("resume-all", '\0', "resumes all devices"),
resumeAllDevs("resume-all-devs", '\0', "resumes all devices"),
resumeAllDirs("resume-all-dirs", '\0', "resumes all directories"),
waitForIdle("wait-for-idle", 'w', "waits until the specified dirs/devs are idling"),
dir("dir", 'd', "specifies the directory to display status info for (default is all dirs)", {"ID"}),
dev("dev", '\0', "specifies the device to display status info for (default is all devs)", {"ID"}),
statusDir("dir", 'd', "specifies the directoies (default is all dirs)", {"ID"}),
statusDev("dev", '\0', "specifies the devices (default is all devs)", {"ID"}),
pauseDir("dir", 'd', "specifies the directories", {"ID"}),
pauseDev("dev", '\0', "specifies the devices", {"ID"}),
configFile("config-file", 'f', "specifies the Syncthing config file", {"path"}),
apiKey("api-key", 'k', "specifies the API key", {"key"}),
url("url", 'u', "specifies the Syncthing URL, default is http://localhost:8080", {"URL"}),
credentials("credentials", 'c', "specifies user name and password", {"user name", "password"}),
certificate("cert", '\0', "specifies the certificate used by the Syncthing instance", {"path"})
{
dir.setConstraints(0, -1), dev.setConstraints(0, -1);
status.setSubArguments({&dir, &dev});
waitForIdle.setSubArguments({&dir, &dev});
for(Argument *arg : {&statusDir, &statusDev, &pauseDev, &pauseDir}) {
arg->setConstraints(0, -1);
}
status.setSubArguments({&statusDir, &statusDev});
waitForIdle.setSubArguments({&statusDir, &statusDev});
rescan.setValueNames({"dir ID"});
rescan.setRequiredValueCount(-1);
pause.setSubArguments({&dir, &dev});
resume.setSubArguments({&dir, &dev});
pause.setSubArguments({&pauseDir, &pauseDev});
resume.setSubArguments({&pauseDir, &pauseDev});
parser.setMainArguments({&status, &log, &stop, &restart, &rescan, &rescanAll, &pause, &pauseAll, &resume, &resumeAll,
&waitForIdle, &configFile, &apiKey, &url, &credentials, &certificate, &help});
parser.setMainArguments({&status, &log, &stop, &restart, &rescan, &rescanAll, &pause, &pauseAllDevs, &pauseAllDirs, &resume, &resumeAllDevs,
&resumeAllDirs, &waitForIdle, &configFile, &apiKey, &url, &credentials, &certificate, &help});
// allow setting default values via environment
configFile.setEnvironmentVariable("SYNCTHING_CTL_CONFIG_FILE");

View File

@ -12,8 +12,8 @@ struct Args
Args();
ArgumentParser parser;
HelpArgument help;
OperationArgument status, log, stop, restart, rescan, rescanAll, pause, pauseAll, resume, resumeAll, waitForIdle;
ConfigValueArgument dir, dev;
OperationArgument status, log, stop, restart, rescan, rescanAll, pause, pauseAllDevs, pauseAllDirs, resume, resumeAllDevs, resumeAllDirs, waitForIdle;
ConfigValueArgument statusDir, statusDev, pauseDir, pauseDev;
ConfigValueArgument configFile, apiKey, url, credentials, certificate;
};

View File

@ -292,6 +292,10 @@ void SyncthingConnection::resumeAllDevs()
}
}
/*!
* \brief Alters the specified \a config so that the specified \a dirs are paused or not.
* \returns Returns whether the config has been altered (all dirs might have been already paused/unpaused).
*/
bool setPaused(QJsonObject &config, const QStringList &dirs, bool paused)
{
bool altered = false;
@ -320,12 +324,12 @@ bool setPaused(QJsonObject &config, const QStringList &dirs, bool paused)
* \brief Pauses the directories with the specified IDs.
* \remarks Calling this method when not connected results in an error because the *current* Syncthing config must
* be available for this call.
*
* \returns Returns whether a request has been made.
* The signal error() is emitted when the request was not successful.
*/
void SyncthingConnection::pauseDirectories(const QStringList &dirIds)
bool SyncthingConnection::pauseDirectories(const QStringList &dirIds)
{
pauseResumeDirectory(dirIds, true);
return pauseResumeDirectory(dirIds, true);
}
/*!
@ -335,9 +339,9 @@ void SyncthingConnection::pauseDirectories(const QStringList &dirIds)
*
* The signal error() is emitted when the request was not successful.
*/
void SyncthingConnection::pauseAllDirs()
bool SyncthingConnection::pauseAllDirs()
{
pauseResumeDirectory(directoryIds(), true);
return pauseResumeDirectory(directoryIds(), true);
}
/*!
@ -347,9 +351,9 @@ void SyncthingConnection::pauseAllDirs()
*
* The signal error() is emitted when the request was not successful.
*/
void SyncthingConnection::resumeDirectories(const QStringList &dirIds)
bool SyncthingConnection::resumeDirectories(const QStringList &dirIds)
{
pauseResumeDirectory(dirIds, false);
return pauseResumeDirectory(dirIds, false);
}
/*!
@ -359,9 +363,9 @@ void SyncthingConnection::resumeDirectories(const QStringList &dirIds)
*
* The signal error() is emitted when the request was not successful.
*/
void SyncthingConnection::resumeAllDirs()
bool SyncthingConnection::resumeAllDirs()
{
pauseResumeDirectory(directoryIds(), false);
return pauseResumeDirectory(directoryIds(), false);
}
/*!
@ -449,11 +453,15 @@ QNetworkReply *SyncthingConnection::postData(const QString &path, const QUrlQuer
return reply;
}
void SyncthingConnection::pauseResumeDirectory(const QStringList &dirIds, bool paused)
/*!
* \brief Internally used to pause/resume directories.
* \returns Returns whether a request has been made.
*/
bool SyncthingConnection::pauseResumeDirectory(const QStringList &dirIds, bool paused)
{
if(!isConnected()) {
emit error(tr("Unable to pause/resume a directories when not connected"), SyncthingErrorCategory::SpecificRequest, QNetworkReply::NoError);
return;
return false;
}
QJsonObject config = m_rawConfig;
@ -464,7 +472,9 @@ void SyncthingConnection::pauseResumeDirectory(const QStringList &dirIds, bool p
reply->setProperty("dirIds", dirIds);
reply->setProperty("resume", !paused);
QObject::connect(reply, &QNetworkReply::finished, this, &SyncthingConnection::readDirPauseResume);
return true;
}
return false;
}
/*!

View File

@ -129,10 +129,10 @@ public Q_SLOTS:
void pauseAllDevs();
void resumeDevice(const QString &devId);
void resumeAllDevs();
void pauseDirectories(const QStringList &dirIds);
void pauseAllDirs();
void resumeDirectories(const QStringList &dirIds);
void resumeAllDirs();
bool pauseDirectories(const QStringList &dirIds);
bool pauseAllDirs();
bool resumeDirectories(const QStringList &dirIds);
bool resumeAllDirs();
void rescan(const QString &dirId, const QString &relpath = QString());
void rescanAllDirs();
void restart();
@ -205,7 +205,7 @@ private:
QNetworkRequest prepareRequest(const QString &path, const QUrlQuery &query, bool rest = true);
QNetworkReply *requestData(const QString &path, const QUrlQuery &query, bool rest = true);
QNetworkReply *postData(const QString &path, const QUrlQuery &query, const QByteArray &data = QByteArray());
void pauseResumeDirectory(const QStringList &dirIds, bool paused);
bool pauseResumeDirectory(const QStringList &dirIds, bool paused);
SyncthingDir *addDirInfo(std::vector<SyncthingDir> &dirs, const QString &dirId);
SyncthingDev *addDevInfo(std::vector<SyncthingDev> &devs, const QString &devId);

View File

@ -4,158 +4,172 @@
<context>
<name>Data::SyncthingConnection</name>
<message>
<location filename="../syncthingconnection.cpp" line="104"/>
<location filename="../syncthingconnection.cpp" line="103"/>
<source>disconnected</source>
<translation>Verbindung getrennt</translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="106"/>
<location filename="../syncthingconnection.cpp" line="105"/>
<source>reconnecting</source>
<translation>Verbindung wird hergestellt</translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="108"/>
<location filename="../syncthingconnection.cpp" line="107"/>
<source>connected</source>
<translation>verbunden</translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="110"/>
<location filename="../syncthingconnection.cpp" line="109"/>
<source>connected, paused</source>
<translation>verbunden, pausiert</translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="112"/>
<location filename="../syncthingconnection.cpp" line="111"/>
<source>connected, synchronizing</source>
<translation>verbunden, am Synchronisieren</translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="114"/>
<location filename="../syncthingconnection.cpp" line="113"/>
<source>unknown</source>
<translation>Verbindungsstatus unbekannt</translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="141"/>
<location filename="../syncthingconnection.cpp" line="228"/>
<location filename="../syncthingconnection.cpp" line="140"/>
<location filename="../syncthingconnection.cpp" line="227"/>
<source>Connection configuration is insufficient.</source>
<translation>Verbindungskonfiguration is ungenügend</translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="611"/>
<location filename="../syncthingconnection.cpp" line="463"/>
<source>Unable to pause/resume a directories when not connected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="720"/>
<source>Unable to request QR-Code: </source>
<translation>Fehler beim Abfragen des QR-Codes: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="640"/>
<location filename="../syncthingconnection.cpp" line="749"/>
<source>Unable to parse Syncthing log: </source>
<translation>Fehler beim Auslesen des Syncthing-Logs: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="644"/>
<location filename="../syncthingconnection.cpp" line="753"/>
<source>Unable to request Syncthing log: </source>
<translation>Fehler beim Abfragen des Syncthing-Logs: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="678"/>
<location filename="../syncthingconnection.cpp" line="787"/>
<source>Unable to locate certificate used by Syncthing.</source>
<translation>Das SSL-Zertifikat von Syncthing kann nicht gefunden werden.</translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="684"/>
<location filename="../syncthingconnection.cpp" line="793"/>
<source>Unable to load certificate used by Syncthing.</source>
<translation>Das SSL-Zertifikat von Syncthing kann nicht ausgelesen werden.</translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="769"/>
<location filename="../syncthingconnection.cpp" line="878"/>
<source>Unable to parse Syncthing config: </source>
<translation>Fehler beim Auslesen der Syncthing-Konfiguration: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="775"/>
<location filename="../syncthingconnection.cpp" line="884"/>
<source>Unable to request Syncthing config: </source>
<translation>Fehler beim Abfragen der Syncthing-Konfiguration: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="875"/>
<location filename="../syncthingconnection.cpp" line="984"/>
<source>Unable to parse Syncthing status: </source>
<translation>Fehler beim Auslesen des Syncthing-Status: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="881"/>
<location filename="../syncthingconnection.cpp" line="990"/>
<source>Unable to request Syncthing status: </source>
<translation>Fehler beim Abfragen des Syncthing-Status: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="960"/>
<location filename="../syncthingconnection.cpp" line="1069"/>
<source>Unable to parse connections: </source>
<translation>Fehler beim Auslesen der Verbindungen: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="966"/>
<location filename="../syncthingconnection.cpp" line="1075"/>
<source>Unable to request connections: </source>
<translation>Fehler beim Abfragen der Verbindungen: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1020"/>
<location filename="../syncthingconnection.cpp" line="1129"/>
<source>Unable to parse directory statistics: </source>
<translation>Fehler beim Auslesen der Verzeichnisstatistiken: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1026"/>
<location filename="../syncthingconnection.cpp" line="1135"/>
<source>Unable to request directory statistics: </source>
<translation>Fehler beim Abfragen der Verzeichnisstatistiken: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1062"/>
<location filename="../syncthingconnection.cpp" line="1171"/>
<source>Unable to parse device statistics: </source>
<translation>Fehler beim Auslesen der Gerätestatistiken: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1068"/>
<location filename="../syncthingconnection.cpp" line="1177"/>
<source>Unable to request device statistics: </source>
<translation>Fehler beim Abfragen der Gerätestatistiken: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1106"/>
<location filename="../syncthingconnection.cpp" line="1215"/>
<source>Unable to parse errors: </source>
<translation>Fehler beim Auslesen der Syncthing-Fehlermeldungen: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1117"/>
<location filename="../syncthingconnection.cpp" line="1226"/>
<source>Unable to request errors: </source>
<translation>Fehler beim Abfragen der Syncthing-Fehlermeldungen: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1133"/>
<location filename="../syncthingconnection.cpp" line="1242"/>
<source>Unable to request clearing errors: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1186"/>
<location filename="../syncthingconnection.cpp" line="1295"/>
<source>Unable to parse Syncthing events: </source>
<translation>Fehler beim Auslesen der Syncthing-Ereignisse: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1208"/>
<location filename="../syncthingconnection.cpp" line="1317"/>
<source>Unable to request Syncthing events: </source>
<translation>Fehler beim Abfragen der Syncthing-Ereignisse: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1484"/>
<location filename="../syncthingconnection.cpp" line="1593"/>
<source>Unable to request rescan: </source>
<translation>Fehler beim Anfordern eines Verzeichnis-Rescans: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1504"/>
<source>Unable to request pause/resume: </source>
<translation>Fehler beim Anfordern Gerät zu Pausieren/Fortzusetzen: </translation>
<location filename="../syncthingconnection.cpp" line="1613"/>
<source>Unable to request device pause/resume: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1520"/>
<location filename="../syncthingconnection.cpp" line="1630"/>
<source>Unable to request directory pause/resume: </source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to request pause/resume: </source>
<translation type="vanished">Fehler beim Anfordern Gerät zu Pausieren/Fortzusetzen: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1646"/>
<source>Unable to request restart: </source>
<translation>Fehler beim Anfordern eines Neustarts: </translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1536"/>
<location filename="../syncthingconnection.cpp" line="1662"/>
<source>Unable to request shutdown: </source>
<translation>Fehler beim Anfordern Syncthing zu beenden: </translation>
</message>

View File

@ -4,158 +4,168 @@
<context>
<name>Data::SyncthingConnection</name>
<message>
<location filename="../syncthingconnection.cpp" line="104"/>
<location filename="../syncthingconnection.cpp" line="103"/>
<source>disconnected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="106"/>
<location filename="../syncthingconnection.cpp" line="105"/>
<source>reconnecting</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="108"/>
<location filename="../syncthingconnection.cpp" line="107"/>
<source>connected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="110"/>
<location filename="../syncthingconnection.cpp" line="109"/>
<source>connected, paused</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="112"/>
<location filename="../syncthingconnection.cpp" line="111"/>
<source>connected, synchronizing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="114"/>
<location filename="../syncthingconnection.cpp" line="113"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="141"/>
<location filename="../syncthingconnection.cpp" line="228"/>
<location filename="../syncthingconnection.cpp" line="140"/>
<location filename="../syncthingconnection.cpp" line="227"/>
<source>Connection configuration is insufficient.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="611"/>
<location filename="../syncthingconnection.cpp" line="463"/>
<source>Unable to pause/resume a directories when not connected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="720"/>
<source>Unable to request QR-Code: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="640"/>
<location filename="../syncthingconnection.cpp" line="749"/>
<source>Unable to parse Syncthing log: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="644"/>
<location filename="../syncthingconnection.cpp" line="753"/>
<source>Unable to request Syncthing log: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="678"/>
<location filename="../syncthingconnection.cpp" line="787"/>
<source>Unable to locate certificate used by Syncthing.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="684"/>
<location filename="../syncthingconnection.cpp" line="793"/>
<source>Unable to load certificate used by Syncthing.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="769"/>
<location filename="../syncthingconnection.cpp" line="878"/>
<source>Unable to parse Syncthing config: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="775"/>
<location filename="../syncthingconnection.cpp" line="884"/>
<source>Unable to request Syncthing config: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="875"/>
<location filename="../syncthingconnection.cpp" line="984"/>
<source>Unable to parse Syncthing status: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="881"/>
<location filename="../syncthingconnection.cpp" line="990"/>
<source>Unable to request Syncthing status: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="960"/>
<location filename="../syncthingconnection.cpp" line="1069"/>
<source>Unable to parse connections: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="966"/>
<location filename="../syncthingconnection.cpp" line="1075"/>
<source>Unable to request connections: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1020"/>
<location filename="../syncthingconnection.cpp" line="1129"/>
<source>Unable to parse directory statistics: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1026"/>
<location filename="../syncthingconnection.cpp" line="1135"/>
<source>Unable to request directory statistics: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1062"/>
<location filename="../syncthingconnection.cpp" line="1171"/>
<source>Unable to parse device statistics: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1068"/>
<location filename="../syncthingconnection.cpp" line="1177"/>
<source>Unable to request device statistics: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1106"/>
<location filename="../syncthingconnection.cpp" line="1215"/>
<source>Unable to parse errors: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1117"/>
<location filename="../syncthingconnection.cpp" line="1226"/>
<source>Unable to request errors: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1133"/>
<location filename="../syncthingconnection.cpp" line="1242"/>
<source>Unable to request clearing errors: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1186"/>
<location filename="../syncthingconnection.cpp" line="1295"/>
<source>Unable to parse Syncthing events: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1208"/>
<location filename="../syncthingconnection.cpp" line="1317"/>
<source>Unable to request Syncthing events: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1484"/>
<location filename="../syncthingconnection.cpp" line="1593"/>
<source>Unable to request rescan: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1504"/>
<source>Unable to request pause/resume: </source>
<location filename="../syncthingconnection.cpp" line="1613"/>
<source>Unable to request device pause/resume: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1520"/>
<location filename="../syncthingconnection.cpp" line="1630"/>
<source>Unable to request directory pause/resume: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1646"/>
<source>Unable to request restart: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../syncthingconnection.cpp" line="1536"/>
<location filename="../syncthingconnection.cpp" line="1662"/>
<source>Unable to request shutdown: </source>
<translation type="unfinished"></translation>
</message>

View File

@ -309,22 +309,22 @@
<context>
<name>QtGui::DirView</name>
<message>
<location filename="../gui/dirview.cpp" line="51"/>
<location filename="../gui/dirview.cpp" line="53"/>
<source>Errors of %1</source>
<translation>Fehler von %1</translation>
</message>
<message>
<location filename="../gui/dirview.cpp" line="68"/>
<location filename="../gui/dirview.cpp" line="70"/>
<source>Copy value</source>
<translation>Wert kopieren</translation>
</message>
<message>
<location filename="../gui/dirview.cpp" line="70"/>
<location filename="../gui/dirview.cpp" line="72"/>
<source>Copy label/ID</source>
<translation>Namen/ID kopieren</translation>
</message>
<message>
<location filename="../gui/dirview.cpp" line="71"/>
<location filename="../gui/dirview.cpp" line="73"/>
<source>Copy path</source>
<translation>Pfad kopieren</translation>
</message>
@ -729,19 +729,19 @@
</message>
<message>
<location filename="../gui/traywidget.ui" line="72"/>
<location filename="../gui/traywidget.cpp" line="182"/>
<location filename="../gui/traywidget.cpp" line="183"/>
<source>About</source>
<translation>Über Syncthing Tray</translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="99"/>
<location filename="../gui/traywidget.cpp" line="320"/>
<location filename="../gui/traywidget.cpp" line="321"/>
<source>Connect</source>
<translation>Verbinden</translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="113"/>
<location filename="../gui/traywidget.cpp" line="523"/>
<location filename="../gui/traywidget.cpp" line="533"/>
<source>Start</source>
<translation>Starten</translation>
</message>
@ -773,7 +773,7 @@
<message>
<location filename="../gui/traywidget.ui" line="250"/>
<location filename="../gui/traywidget.ui" line="270"/>
<location filename="../gui/traywidget.cpp" line="481"/>
<location filename="../gui/traywidget.cpp" line="491"/>
<source>unknown</source>
<translation>unbekannt</translation>
</message>
@ -797,7 +797,7 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<message>
<location filename="../gui/traywidget.ui" line="311"/>
<location filename="../gui/traywidget.cpp" line="112"/>
<location filename="../gui/traywidget.cpp" line="266"/>
<location filename="../gui/traywidget.cpp" line="267"/>
<source>New notifications</source>
<translation>Neue Benachrichtigungen</translation>
</message>
@ -852,67 +852,67 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<translation>Verbindung</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="212"/>
<location filename="../gui/traywidget.cpp" line="213"/>
<source>Own device ID</source>
<translation>Eigene Geräte-ID</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="222"/>
<location filename="../gui/traywidget.cpp" line="223"/>
<source>device ID is unknown</source>
<translation>die Geräte-ID ist unbekannt</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="230"/>
<location filename="../gui/traywidget.cpp" line="231"/>
<source>Copy to clipboard</source>
<translation>in Zwischenablage kopieren</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="247"/>
<location filename="../gui/traywidget.cpp" line="248"/>
<source>Log</source>
<translation></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="296"/>
<location filename="../gui/traywidget.cpp" line="297"/>
<source>Do you really want to restart Syncthing?</source>
<translation>Soll Syncthing wirklich neu gestartet werden?</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="321"/>
<location filename="../gui/traywidget.cpp" line="322"/>
<source>Not connected to Syncthing, click to connect</source>
<translation>Verbindung zu Syncthing getrennt, klicke um zu verbinden</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="332"/>
<location filename="../gui/traywidget.cpp" line="333"/>
<source>Pause</source>
<translation>Pausieren</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="333"/>
<location filename="../gui/traywidget.cpp" line="334"/>
<source>Syncthing is running, click to pause all devices</source>
<translation>Syncthing läuft, klicke um alle Geräte zu pausieren</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="338"/>
<location filename="../gui/traywidget.cpp" line="339"/>
<source>Continue</source>
<translation>Fortsetzen</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="339"/>
<location filename="../gui/traywidget.cpp" line="340"/>
<source>At least one device is paused, click to resume</source>
<translation>Mind. ein Gerät ist pausiert, klicke um fortzusetzen</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="428"/>
<location filename="../gui/traywidget.cpp" line="429"/>
<source>The directory &lt;i&gt;%1&lt;/i&gt; does not exist on the local machine.</source>
<translation>Das Verzeichnis &lt;i&gt;%i&lt;/i&gt; existiert nicht (lokal).</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="437"/>
<location filename="../gui/traywidget.cpp" line="438"/>
<source>The file &lt;i&gt;%1&lt;/i&gt; does not exist on the local machine.</source>
<translation>Die Datei &lt;i&gt;%1&lt;/i&gt; existiert nicht (lokal).</translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="519"/>
<location filename="../gui/traywidget.cpp" line="529"/>
<source>Stop</source>
<translation>Stoppen</translation>
</message>

View File

@ -309,22 +309,22 @@
<context>
<name>QtGui::DirView</name>
<message>
<location filename="../gui/dirview.cpp" line="51"/>
<location filename="../gui/dirview.cpp" line="53"/>
<source>Errors of %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/dirview.cpp" line="68"/>
<location filename="../gui/dirview.cpp" line="70"/>
<source>Copy value</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/dirview.cpp" line="70"/>
<location filename="../gui/dirview.cpp" line="72"/>
<source>Copy label/ID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/dirview.cpp" line="71"/>
<location filename="../gui/dirview.cpp" line="73"/>
<source>Copy path</source>
<translation type="unfinished"></translation>
</message>
@ -726,19 +726,19 @@
</message>
<message>
<location filename="../gui/traywidget.ui" line="72"/>
<location filename="../gui/traywidget.cpp" line="182"/>
<location filename="../gui/traywidget.cpp" line="183"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="99"/>
<location filename="../gui/traywidget.cpp" line="320"/>
<location filename="../gui/traywidget.cpp" line="321"/>
<source>Connect</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.ui" line="113"/>
<location filename="../gui/traywidget.cpp" line="523"/>
<location filename="../gui/traywidget.cpp" line="533"/>
<source>Start</source>
<translation type="unfinished"></translation>
</message>
@ -770,7 +770,7 @@
<message>
<location filename="../gui/traywidget.ui" line="250"/>
<location filename="../gui/traywidget.ui" line="270"/>
<location filename="../gui/traywidget.cpp" line="481"/>
<location filename="../gui/traywidget.cpp" line="491"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
@ -793,7 +793,7 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<message>
<location filename="../gui/traywidget.ui" line="311"/>
<location filename="../gui/traywidget.cpp" line="112"/>
<location filename="../gui/traywidget.cpp" line="266"/>
<location filename="../gui/traywidget.cpp" line="267"/>
<source>New notifications</source>
<translation type="unfinished"></translation>
</message>
@ -848,67 +848,67 @@ For &lt;i&gt;all&lt;/i&gt; notifications, checkout the log</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="212"/>
<location filename="../gui/traywidget.cpp" line="213"/>
<source>Own device ID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="222"/>
<location filename="../gui/traywidget.cpp" line="223"/>
<source>device ID is unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="230"/>
<location filename="../gui/traywidget.cpp" line="231"/>
<source>Copy to clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="247"/>
<location filename="../gui/traywidget.cpp" line="248"/>
<source>Log</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="296"/>
<location filename="../gui/traywidget.cpp" line="297"/>
<source>Do you really want to restart Syncthing?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="321"/>
<location filename="../gui/traywidget.cpp" line="322"/>
<source>Not connected to Syncthing, click to connect</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="332"/>
<location filename="../gui/traywidget.cpp" line="333"/>
<source>Pause</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="333"/>
<location filename="../gui/traywidget.cpp" line="334"/>
<source>Syncthing is running, click to pause all devices</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="338"/>
<location filename="../gui/traywidget.cpp" line="339"/>
<source>Continue</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="339"/>
<location filename="../gui/traywidget.cpp" line="340"/>
<source>At least one device is paused, click to resume</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="428"/>
<location filename="../gui/traywidget.cpp" line="429"/>
<source>The directory &lt;i&gt;%1&lt;/i&gt; does not exist on the local machine.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="437"/>
<location filename="../gui/traywidget.cpp" line="438"/>
<source>The file &lt;i&gt;%1&lt;/i&gt; does not exist on the local machine.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/traywidget.cpp" line="519"/>
<location filename="../gui/traywidget.cpp" line="529"/>
<source>Stop</source>
<translation type="unfinished"></translation>
</message>