diff --git a/src/library/sysadm-lifepreserver.cpp b/src/library/sysadm-lifepreserver.cpp index 683a5b4..b96582d 100644 --- a/src/library/sysadm-lifepreserver.cpp +++ b/src/library/sysadm-lifepreserver.cpp @@ -6,12 +6,14 @@ //=========================================== #include "sysadm-general.h" #include "sysadm-lifepreserver.h" -//PLEASE: Keep the functions in the same order as listed in pcbsd-general.h - #include "sysadm-global.h" +#include "QJsonValue" + using namespace sysadm; +//PLEASE: Keep the functions in the same order as listed in pcbsd-general.h + // Build list of scheduled cron snapshot jobs QJsonObject LifePreserver::listCron() { QJsonObject retObject; @@ -49,3 +51,57 @@ QJsonObject LifePreserver::listCron() { return retObject; } + +// Return a list of snapshots on a particular pool / dataset +QJsonObject LifePreserver::listSnap(QJsonObject jsin) { + QJsonObject retObject; + QString pool; + + QStringList keys = jsin.keys(); + bool ok = false; + if(! keys.contains("pool")){ + retObject.insert("error", "Missing pool key"); + return retObject; + } + + // Check which pool we are looking at + pool = jsin.value("pool").toString(); + + // Make sure we have the pool key + if ( pool.isEmpty() ) { + retObject.insert("error", "Missing pool key"); + return retObject; + } + + QStringList output = General::RunCommand("lpreserver listsnap " + pool ).split("\n"); + QList snaps; + QStringList snapitems; + QRegExp sep("\\s+"); + + // Parse the output + bool inSection = false; + for ( int i = 0; i < output.size(); i++) + { + if ( output.at(i).indexOf("-----------------") != -1 ) { + inSection = true; + continue; + } + + if (!inSection) + continue; + + if ( output.at(i).isEmpty() || output.at(i).indexOf("-----------------") != -1 ) + break; + + // Breakdown this snapshot + snapitems.clear(); + snapitems << output.at(i).section(sep, 0, 0).simplified(); + snapitems << output.at(i).section(sep, 1, -1).simplified(); + + QJsonObject values; + values.insert("comment", snapitems.at(1)); + retObject.insert(snapitems.at(0), values); + } + + return retObject; +} diff --git a/src/library/sysadm-lifepreserver.h b/src/library/sysadm-lifepreserver.h index 560fcf8..7b749d9 100644 --- a/src/library/sysadm-lifepreserver.h +++ b/src/library/sysadm-lifepreserver.h @@ -16,6 +16,7 @@ class LifePreserver{ public: // List schedule snapshots static QJsonObject listCron(); + static QJsonObject listSnap(QJsonObject jsin); }; } //end of pcbsd namespace diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index 1e79c27..2b64bb6 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -145,6 +145,10 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmLifePreserverRequest(const Q ok = true; out->insert("listcron", sysadm::LifePreserver::listCron()); } + if(act=="listsnap"){ + ok = true; + out->insert("listsnap", sysadm::LifePreserver::listSnap(in_args.toObject())); + } } //end of "action" key usage