summaryrefslogtreecommitdiff
path: root/src/plugins/remotelinux/remotelinuxcheckforfreediskspaceservice.cpp
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@nokia.com>2012-05-30 18:22:17 +0200
committerChristian Kandeler <christian.kandeler@nokia.com>2012-05-31 14:07:22 +0200
commitff584622f48474e054ee4e44b2d0646513df4b19 (patch)
treebbf18e34e3f2aecbf2e597ddf3cedc8d76cb4358 /src/plugins/remotelinux/remotelinuxcheckforfreediskspaceservice.cpp
parentf10d751466c68cd8f999aa73884c5f2452632fd3 (diff)
downloadqt-creator-ff584622f48474e054ee4e44b2d0646513df4b19.tar.gz
RemoteLinux: Add new deploy step that checks for free space.
Tool output in the "disk full" case can be rather unhelpful, so we check in advance. Change-Id: Ia3f5f0b456b91acf9a8f8e72de870e1df6ea8e80 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@nokia.com>
Diffstat (limited to 'src/plugins/remotelinux/remotelinuxcheckforfreediskspaceservice.cpp')
-rw-r--r--src/plugins/remotelinux/remotelinuxcheckforfreediskspaceservice.cpp169
1 files changed, 169 insertions, 0 deletions
diff --git a/src/plugins/remotelinux/remotelinuxcheckforfreediskspaceservice.cpp b/src/plugins/remotelinux/remotelinuxcheckforfreediskspaceservice.cpp
new file mode 100644
index 0000000000..d7610c650c
--- /dev/null
+++ b/src/plugins/remotelinux/remotelinuxcheckforfreediskspaceservice.cpp
@@ -0,0 +1,169 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+**
+** GNU Lesser General Public License Usage
+**
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this file.
+** Please review the following information to ensure the GNU Lesser General
+** Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** Other Usage
+**
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**************************************************************************/
+#include "remotelinuxcheckforfreediskspaceservice.h"
+
+#include "linuxdeviceconfiguration.h"
+
+#include <ssh/sshremoteprocessrunner.h>
+
+#include <QByteArray>
+#include <QString>
+
+namespace RemoteLinux {
+namespace Internal {
+class RemoteLinuxCheckForFreeDiskSpaceServicePrivate
+{
+public:
+ QString pathToCheck;
+ quint64 requiredSpaceInBytes;
+ QSsh::SshRemoteProcessRunner *processRunner;
+ QByteArray processOutput;
+};
+} // namespace Internal
+
+RemoteLinuxCheckForFreeDiskSpaceService::RemoteLinuxCheckForFreeDiskSpaceService(QObject *parent)
+ : AbstractRemoteLinuxDeployService(parent),
+ d(new Internal::RemoteLinuxCheckForFreeDiskSpaceServicePrivate)
+{
+ d->processRunner = 0;
+ d->requiredSpaceInBytes = 0;
+}
+
+RemoteLinuxCheckForFreeDiskSpaceService::~RemoteLinuxCheckForFreeDiskSpaceService()
+{
+ cleanup();
+ delete d;
+}
+
+void RemoteLinuxCheckForFreeDiskSpaceService::setPathToCheck(const QString &path)
+{
+ d->pathToCheck = path;
+}
+
+void RemoteLinuxCheckForFreeDiskSpaceService::setRequiredSpaceInBytes(quint64 sizeInBytes)
+{
+ d->requiredSpaceInBytes = sizeInBytes;
+}
+
+void RemoteLinuxCheckForFreeDiskSpaceService::handleStdOut(const QByteArray &output)
+{
+ d->processOutput += output;
+}
+
+void RemoteLinuxCheckForFreeDiskSpaceService::handleStdErr(const QByteArray &output)
+{
+ emit stdErrData(QString::fromUtf8(output));
+}
+
+void RemoteLinuxCheckForFreeDiskSpaceService::handleProcessFinished()
+{
+ switch (d->processRunner->processExitStatus()) {
+ case QSsh::SshRemoteProcess::FailedToStart:
+ emit errorMessage(tr("Remote process failed to start."));
+ stopDeployment();
+ return;
+ case QSsh::SshRemoteProcess::KilledBySignal:
+ emit errorMessage(tr("Remote process crashed."));
+ stopDeployment();
+ return;
+ case QSsh::SshRemoteProcess::ExitedNormally:
+ break;
+ }
+
+ bool isNumber;
+ d->processOutput.chop(1); // newline
+ quint64 freeSpace = d->processOutput.toULongLong(&isNumber);
+ if (!isNumber) {
+ emit errorMessage(tr("Unexpected output from remote process: '%1'.")
+ .arg(QString::fromUtf8(d->processOutput)));
+ stopDeployment();
+ return;
+ }
+
+ freeSpace *= 1024;
+ if (freeSpace < d->requiredSpaceInBytes) {
+ emit errorMessage(tr("The remote file system has only %1 bytes of free space, "
+ "but %2 bytes are required.").arg(freeSpace).arg(d->requiredSpaceInBytes));
+ stopDeployment();
+ return;
+ }
+
+ emit progressMessage(tr("The remote file system has %1 bytes of free space, going ahead.")
+ .arg(freeSpace));
+ stopDeployment();
+}
+
+bool RemoteLinuxCheckForFreeDiskSpaceService::isDeploymentPossible(QString *whyNot) const
+{
+ if (!AbstractRemoteLinuxDeployService::isDeploymentPossible(whyNot))
+ return false;
+ if (!d->pathToCheck.startsWith(QLatin1Char('/'))) {
+ if (whyNot) {
+ *whyNot = tr("Cannot check for free disk space: '%1' is not an absolute path.")
+ .arg(d->pathToCheck);
+ }
+ return false;
+ }
+ return true;
+}
+
+void RemoteLinuxCheckForFreeDiskSpaceService::doDeploy()
+{
+ d->processRunner = new QSsh::SshRemoteProcessRunner;
+ connect(d->processRunner, SIGNAL(processClosed(int)), SLOT(handleProcessFinished()));
+ connect(d->processRunner, SIGNAL(processOutputAvailable(QByteArray)),
+ SLOT(handleStdOut(QByteArray)));
+ connect(d->processRunner, SIGNAL(processErrorOutputAvailable(QByteArray)),
+ SLOT(handleStdErr(QByteArray)));
+ const QString command = QString::fromLocal8Bit("df -k -P %1 |tail -n 1 |sed 's/ */ /g' "
+ "|cut -d ' ' -f 4").arg(d->pathToCheck);
+ d->processRunner->run(command.toUtf8(), deviceConfiguration()->sshParameters());
+}
+
+void RemoteLinuxCheckForFreeDiskSpaceService::stopDeployment()
+{
+ cleanup();
+ handleDeploymentDone();
+}
+
+void RemoteLinuxCheckForFreeDiskSpaceService::cleanup()
+{
+ if (d->processRunner) {
+ disconnect(d->processRunner, 0, this, 0);
+ d->processRunner->cancel();
+ delete d->processRunner;
+ d->processRunner = 0;
+ }
+ d->processOutput.clear();
+}
+
+} // namespace RemoteLinux