From 2ac57ce76cf13fbd860ddda63ed23da064050a91 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Tue, 27 Aug 2013 09:45:34 -0400 Subject: [PATCH] Setup the life preserver backend to use QProcesses for all commands, and process window events while commands are running. --- src-qt4/life-preserver/LPBackend.cpp | 118 +++++++++++---------------- src-qt4/life-preserver/LPBackend.h | 5 ++ 2 files changed, 51 insertions(+), 72 deletions(-) diff --git a/src-qt4/life-preserver/LPBackend.cpp b/src-qt4/life-preserver/LPBackend.cpp index abc3b48f7..42bc49a6e 100644 --- a/src-qt4/life-preserver/LPBackend.cpp +++ b/src-qt4/life-preserver/LPBackend.cpp @@ -5,13 +5,7 @@ // ============== QStringList LPBackend::listPossibleDatasets(){ QString cmd = "zpool list -H -o name"; - //Need output, so run this in a QProcess - QProcess *proc = new QProcess; - proc->setProcessChannelMode(QProcess::MergedChannels); - proc->start(cmd); - proc->waitForFinished(); - QStringList out = QString(proc->readAllStandardOutput()).split("\n"); - delete proc; + QStringList out = LPBackend::getCmdOutput(cmd); //Now process the output (one dataset per line - no headers) QStringList list; for(int i=0; isetProcessChannelMode(QProcess::MergedChannels); - proc->start(cmd); - proc->waitForFinished(); - QStringList out = QString(proc->readAllStandardOutput()).split("\n"); - delete proc; + QStringList out = LPBackend::getCmdOutput(cmd); //Now process the output QStringList list; for(int i=2; isetProcessChannelMode(QProcess::MergedChannels); - proc->start(cmd); - proc->waitForFinished(); - QStringList out = QString(proc->readAllStandardOutput()).split("\n"); - delete proc; + QStringList out = LPBackend::getCmdOutput(cmd); //Now process the output (one dataset per line - no headers) QStringList list; for(int i=0; isetProcessChannelMode(QProcess::MergedChannels); - proc->start(cmd); - proc->waitForFinished(); - QStringList out = QString(proc->readAllStandardOutput()).split("\n"); - delete proc; + QStringList out = LPBackend::getCmdOutput(cmd); //Now process the output QStringList list; for(int i=out.length()-1; i>=0; i--){ //go in reverse order for proper time format (newest first) @@ -99,13 +75,7 @@ QStringList LPBackend::listLPSnapshots(QString dataset){ QStringList LPBackend::listReplicationTargets(){ QString cmd = "lpreserver replicate list"; - //Need output, so run this in a QProcess - QProcess *proc = new QProcess; - proc->setProcessChannelMode(QProcess::MergedChannels); - proc->start(cmd); - proc->waitForFinished(); - QStringList out = QString(proc->readAllStandardOutput()).split("\n"); - delete proc; + QStringList out = LPBackend::getCmdOutput(cmd); //Now process the output QStringList list; for(int i=0; isetProcessChannelMode(QProcess::MergedChannels); - proc->start(cmd); - proc->waitForFinished(); - QStringList out = QString(proc->readAllStandardOutput()).split("\n"); - delete proc; - QStringList list; + QStringList out = LPBackend::getCmdOutput(cmd); //Now process the output + QStringList list; for(int i=2; i:::::: if(out[i].isEmpty()){ continue; } @@ -157,27 +121,21 @@ bool LPBackend::setupDataset(QString dataset, int time, int numToKeep){ //Create the command QString cmd = "lpreserver cronsnap "+dataset+" start "+freq+" "+QString::number(numToKeep); - int ret = system(cmd.toUtf8()); + int ret = LPBackend::runCmd(cmd); return (ret == 0); } bool LPBackend::removeDataset(QString dataset){ QString cmd = "lpreserver cronsnap "+dataset+" stop"; - int ret = system(cmd.toUtf8()); + int ret = LPBackend::runCmd(cmd); return (ret == 0); } bool LPBackend::datasetInfo(QString dataset, int& time, int& numToKeep){ QString cmd = "lpreserver listcron"; - //Need output, so run this in a QProcess - QProcess *proc = new QProcess; - proc->setProcessChannelMode(QProcess::MergedChannels); - proc->start(cmd); - proc->waitForFinished(); - QStringList out = QString(proc->readAllStandardOutput()).split("\n"); - delete proc; + QStringList out = LPBackend::getCmdOutput(cmd); //Now process the output bool ok = false; for(int i=0; isetProcessChannelMode(QProcess::MergedChannels); - proc->start(cmd); - proc->waitForFinished(); - QStringList out = QString(proc->readAllStandardOutput()).split("\n"); - delete proc; + QStringList out = LPBackend::getCmdOutput(cmd); //Now process the output bool ok = false; for(int i=0; i (") QString cmd = "mount"; - //Need output, so run this in a QProcess - QProcess *proc = new QProcess; - proc->setProcessChannelMode(QProcess::MergedChannels); - proc->start(cmd); - proc->waitForFinished(); - QStringList out = QString(proc->readAllStandardOutput()).split("\n"); - delete proc; + QStringList out = LPBackend::getCmdOutput(cmd); //Now process the output QStringList list; for(int i=0; isetProcessChannelMode(QProcess::MergedChannels); + proc->start(cmd); + while(!proc->waitForFinished(300)){ + QCoreApplication::processEvents(); + } + QStringList out = QString(proc->readAllStandardOutput()).split("\n"); + delete proc; + return out; +} + +int LPBackend::runCmd(QString cmd){ + QProcess *proc = new QProcess; + proc->setProcessChannelMode(QProcess::MergedChannels); + proc->start(cmd); + while(!proc->waitForFinished(300)){ + QCoreApplication::processEvents(); + } + int ret = proc->exitCode(); + delete proc; + return ret; +} diff --git a/src-qt4/life-preserver/LPBackend.h b/src-qt4/life-preserver/LPBackend.h index 3eefabc93..7ec2d7ee0 100644 --- a/src-qt4/life-preserver/LPBackend.h +++ b/src-qt4/life-preserver/LPBackend.h @@ -6,6 +6,7 @@ #include #include #include +#include //Class of static functions for using the "lpreserver" backend class LPBackend{ @@ -36,5 +37,9 @@ class LPBackend{ static bool setupSSHKey(QString remoteHost, QString remoteUser, int remotePort); static QStringList findValidUSBDevices(); static bool copySSHKey(QString mountPath, QString localHost); + +private: + static QStringList getCmdOutput(QString); + static int runCmd(QString); }; #endif