Skip to content
Snippets Groups Projects
Commit 23c89c6e authored by Christian Kandeler's avatar Christian Kandeler
Browse files

Maemo: Saner approach to remote mounting.

parent f997de49
No related branches found
No related tags found
No related merge requests found
...@@ -330,6 +330,8 @@ void MaemoDeployStep::handleConnected() ...@@ -330,6 +330,8 @@ void MaemoDeployStep::handleConnected()
Q_ASSERT(!m_currentDeployAction); Q_ASSERT(!m_currentDeployAction);
Q_ASSERT(!m_needsInstall); Q_ASSERT(!m_needsInstall);
Q_ASSERT(m_filesToCopy.isEmpty()); Q_ASSERT(m_filesToCopy.isEmpty());
// TODO: Move this step up. We don't have to be connected to find out
// whether we need to deploy.
const MaemoPackageCreationStep * const pStep = packagingStep(); const MaemoPackageCreationStep * const pStep = packagingStep();
const QString hostName = m_connection->connectionParameters().host; const QString hostName = m_connection->connectionParameters().host;
if (pStep->isPackagingEnabled()) { if (pStep->isPackagingEnabled()) {
......
...@@ -79,8 +79,7 @@ bool MaemoRemoteMounter::addMountSpecification(const MaemoMountSpecification &mo ...@@ -79,8 +79,7 @@ bool MaemoRemoteMounter::addMountSpecification(const MaemoMountSpecification &mo
void MaemoRemoteMounter::mount() void MaemoRemoteMounter::mount()
{ {
m_stop = false; m_stop = false;
Q_ASSERT(m_startedUtfsServers.isEmpty()); Q_ASSERT(m_utfsServers.isEmpty());
Q_ASSERT(m_readyUtfsServers.isEmpty());
if (m_mountSpecs.isEmpty()) if (m_mountSpecs.isEmpty())
emit mounted(); emit mounted();
...@@ -237,7 +236,7 @@ void MaemoRemoteMounter::startUtfsClients() ...@@ -237,7 +236,7 @@ void MaemoRemoteMounter::startUtfsClients()
const QString chmod = QString::fromLocal8Bit("%1 chmod a+r+w+x %2") const QString chmod = QString::fromLocal8Bit("%1 chmod a+r+w+x %2")
.arg(MaemoGlobal::remoteSudo(), mountSpec.remoteMountPoint); .arg(MaemoGlobal::remoteSudo(), mountSpec.remoteMountPoint);
QString utfsClient QString utfsClient
= QString::fromLocal8Bit("%1 --detach -l %2 -r %2 -b %2 %4") = QString::fromLocal8Bit("%1 -l %2 -r %2 -b %2 %4")
.arg(utfsClientOnDevice()).arg(mountInfo.remotePort) .arg(utfsClientOnDevice()).arg(mountInfo.remotePort)
.arg(mountSpec.remoteMountPoint); .arg(mountSpec.remoteMountPoint);
if (mountInfo.mountAsRoot) if (mountInfo.mountAsRoot)
...@@ -248,6 +247,8 @@ void MaemoRemoteMounter::startUtfsClients() ...@@ -248,6 +247,8 @@ void MaemoRemoteMounter::startUtfsClients()
emit reportProgress(tr("Starting remote UTFS clients...")); emit reportProgress(tr("Starting remote UTFS clients..."));
m_utfsClientStderr.clear(); m_utfsClientStderr.clear();
m_mountProcess = m_connection->createRemoteProcess(remoteCall.toUtf8()); m_mountProcess = m_connection->createRemoteProcess(remoteCall.toUtf8());
connect(m_mountProcess.data(), SIGNAL(started()), this,
SLOT(handleUtfsClientsStarted()));
connect(m_mountProcess.data(), SIGNAL(closed(int)), this, connect(m_mountProcess.data(), SIGNAL(closed(int)), this,
SLOT(handleUtfsClientsFinished(int))); SLOT(handleUtfsClientsFinished(int)));
connect(m_mountProcess.data(), SIGNAL(errorOutputAvailable(QByteArray)), connect(m_mountProcess.data(), SIGNAL(errorOutputAvailable(QByteArray)),
...@@ -255,6 +256,12 @@ void MaemoRemoteMounter::startUtfsClients() ...@@ -255,6 +256,12 @@ void MaemoRemoteMounter::startUtfsClients()
m_mountProcess->start(); m_mountProcess->start();
} }
void MaemoRemoteMounter::handleUtfsClientsStarted()
{
if (!m_stop)
startUtfsServers();
}
void MaemoRemoteMounter::handleUtfsClientsFinished(int exitStatus) void MaemoRemoteMounter::handleUtfsClientsFinished(int exitStatus)
{ {
if (m_stop) if (m_stop)
...@@ -262,7 +269,8 @@ void MaemoRemoteMounter::handleUtfsClientsFinished(int exitStatus) ...@@ -262,7 +269,8 @@ void MaemoRemoteMounter::handleUtfsClientsFinished(int exitStatus)
if (exitStatus == SshRemoteProcess::ExitedNormally if (exitStatus == SshRemoteProcess::ExitedNormally
&& m_mountProcess->exitCode() == 0) { && m_mountProcess->exitCode() == 0) {
startUtfsServers(); m_utfsServerTimer->stop();
emit mounted();
} else { } else {
QString errMsg = tr("Failure running UTFS client: %1") QString errMsg = tr("Failure running UTFS client: %1")
.arg(m_mountProcess->errorString()); .arg(m_mountProcess->errorString());
...@@ -288,93 +296,38 @@ void MaemoRemoteMounter::startUtfsServers() ...@@ -288,93 +296,38 @@ void MaemoRemoteMounter::startUtfsServers()
<< port << remoteSecretOpt << port << QLatin1String("-c") << port << remoteSecretOpt << port << QLatin1String("-c")
<< (m_connection->connectionParameters().host + QLatin1Char(':') + port) << (m_connection->connectionParameters().host + QLatin1Char(':') + port)
<< mountSpec.localDir; << mountSpec.localDir;
connect(utfsServerProc.data(), SIGNAL(readyReadStandardError()), this,
SLOT(handleUtfsServerStderr()));
connect(utfsServerProc.data(), connect(utfsServerProc.data(),
SIGNAL(finished(int,QProcess::ExitStatus)), this, SIGNAL(finished(int,QProcess::ExitStatus)), this,
SLOT(handleUtfsServerFinished(int,QProcess::ExitStatus))); SLOT(handleUtfsServerFinished(int,QProcess::ExitStatus)));
connect(utfsServerProc.data(), SIGNAL(error(QProcess::ProcessError)), connect(utfsServerProc.data(), SIGNAL(error(QProcess::ProcessError)),
this, SLOT(handleUtfsServerError(QProcess::ProcessError))); this, SLOT(handleUtfsServerError(QProcess::ProcessError)));
m_startedUtfsServers << utfsServerProc; m_utfsServers << utfsServerProc;
utfsServerProc->start(utfsServer(), utfsServerArgs); utfsServerProc->start(utfsServer(), utfsServerArgs);
} }
} }
void MaemoRemoteMounter::handleUtfsServerStderr() void MaemoRemoteMounter::handleUtfsServerError(QProcess::ProcessError)
{
if (m_stop)
return;
for (int i = 0; i < m_startedUtfsServers.count(); ++i) {
UtfsServerInfo &info = m_startedUtfsServers[i];
if (info.proc.data() == sender()) {
info.output += info.proc->readAllStandardError();
if (info.output.contains("utfs server is ready")) {
m_readyUtfsServers << info;
m_startedUtfsServers.removeAt(i);
if (m_startedUtfsServers.isEmpty()) {
m_utfsServerTimer->stop();
emit mounted();
}
return;
}
break;
}
}
for (int i = 0; i < m_readyUtfsServers.count(); ++i) {
UtfsServerInfo &info = m_readyUtfsServers[i];
if (info.proc.data() == sender()) {
const QByteArray &output = info.proc->readAllStandardError();
qWarning("%s: %s", Q_FUNC_INFO, output.data());
info.output += output;
}
}
}
void MaemoRemoteMounter::handleUtfsServerError(QProcess::ProcessError procError)
{ {
if (procError != QProcess::FailedToStart) if (m_stop || m_utfsServers.isEmpty())
return; return;
for (int i = 0; i < m_startedUtfsServers.count(); ++i) { QProcess * const proc = static_cast<QProcess *>(sender());
const UtfsServerInfo info = m_startedUtfsServers.at(i); QString errorString = proc->errorString();
if (info.proc.data() == sender()) { const QByteArray &errorOutput = proc->readAllStandardError();
QString errorString = info.proc->errorString(); if (!errorOutput.isEmpty()) {
if (!info.output.isEmpty()) { errorString += tr("\nstderr was: %1")
errorString += tr("\nstderr was: %1") .arg(QString::fromLocal8Bit(errorOutput));
.arg(QString::fromLocal8Bit(info.output));
}
killAllUtfsServers();
m_utfsServerTimer->stop();
emit error(tr("Could not start UTFS server: %1").arg(errorString));
return;
}
} }
killAllUtfsServers();
qWarning("%s: Process failed to start", Q_FUNC_INFO); m_utfsServerTimer->stop();
emit error(tr("Error running UTFS server: %1").arg(errorString));
} }
void MaemoRemoteMounter::handleUtfsServerFinished(int exitCode, void MaemoRemoteMounter::handleUtfsServerFinished(int /* exitCode */,
QProcess::ExitStatus exitStatus) QProcess::ExitStatus exitStatus)
{ {
if (exitStatus == QProcess::NormalExit && exitCode == 0) if (!m_stop && exitStatus != QProcess::NormalExit)
return; handleUtfsServerError(static_cast<QProcess *>(sender())->error());
for (int i = 0; i < m_startedUtfsServers.count(); ++i) {
const UtfsServerInfo info = m_startedUtfsServers.at(i);
if (info.proc.data() == sender()) {
QString errorString = info.proc->errorString();
if (!info.output.isEmpty()) {
errorString += tr("\nstderr was: %1")
.arg(QString::fromLocal8Bit(info.output));
}
killAllUtfsServers();
m_utfsServerTimer->stop();
emit error(tr("UTFS server finished unexpectedly: %1").arg(errorString));
return;
}
}
} }
void MaemoRemoteMounter::handleUtfsClientStderr(const QByteArray &output) void MaemoRemoteMounter::handleUtfsClientStderr(const QByteArray &output)
...@@ -400,12 +353,9 @@ QString MaemoRemoteMounter::utfsServer() const ...@@ -400,12 +353,9 @@ QString MaemoRemoteMounter::utfsServer() const
void MaemoRemoteMounter::killAllUtfsServers() void MaemoRemoteMounter::killAllUtfsServers()
{ {
foreach (const UtfsServerInfo &info, m_startedUtfsServers) foreach (const ProcPtr &proc, m_utfsServers)
killUtfsServer(info.proc.data()); killUtfsServer(proc.data());
m_startedUtfsServers.clear(); m_utfsServers.clear();
foreach (const UtfsServerInfo &info, m_readyUtfsServers)
killUtfsServer(info.proc.data());
m_readyUtfsServers.clear();
} }
void MaemoRemoteMounter::killUtfsServer(QProcess *proc) void MaemoRemoteMounter::killUtfsServer(QProcess *proc)
......
...@@ -80,14 +80,14 @@ private slots: ...@@ -80,14 +80,14 @@ private slots:
void handleUploaderInitialized(); void handleUploaderInitialized();
void handleUploaderInitializationFailed(const QString &reason); void handleUploaderInitializationFailed(const QString &reason);
void handleUploadFinished(Core::SftpJobId jobId, const QString &error); void handleUploadFinished(Core::SftpJobId jobId, const QString &error);
void handleUtfsClientsStarted();
void handleUtfsClientsFinished(int exitStatus); void handleUtfsClientsFinished(int exitStatus);
void handleUnmountProcessFinished(int exitStatus);
void handleUtfsClientStderr(const QByteArray &output); void handleUtfsClientStderr(const QByteArray &output);
void handleUtfsServerStderr(); void handleUnmountProcessFinished(int exitStatus);
void handleUtfsServerError(QProcess::ProcessError error); void handleUmountStderr(const QByteArray &output);
void handleUtfsServerError(QProcess::ProcessError procError);
void handleUtfsServerFinished(int exitCode, void handleUtfsServerFinished(int exitCode,
QProcess::ExitStatus exitStatus); QProcess::ExitStatus exitStatus);
void handleUmountStderr(const QByteArray &output);
void handleUtfsServerTimeout(); void handleUtfsServerTimeout();
private: private:
...@@ -118,13 +118,7 @@ private: ...@@ -118,13 +118,7 @@ private:
Core::SftpJobId m_uploadJobId; Core::SftpJobId m_uploadJobId;
typedef QSharedPointer<QProcess> ProcPtr; typedef QSharedPointer<QProcess> ProcPtr;
struct UtfsServerInfo { QList<ProcPtr> m_utfsServers;
UtfsServerInfo(const ProcPtr &p) : proc(p) {}
ProcPtr proc;
QByteArray output;
};
QList<UtfsServerInfo> m_startedUtfsServers;
QList<UtfsServerInfo> m_readyUtfsServers;
bool m_stop; bool m_stop;
QByteArray m_utfsClientStderr; QByteArray m_utfsClientStderr;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment