diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index 0fd60f1..fced59c 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -41,7 +41,7 @@ RestOutputStruct::ExitCode WebSocket::AvailableSubsystems(bool allaccess, QJsonO if(QFile::exists("/usr/local/sbin/beadm")){ out->insert("sysadm/beadm", "read/write"); } - + // - dispatcher (Internal to server - always available) //"read" is the event notifications, "write" is the ability to queue up jobs @@ -213,7 +213,7 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmBEADMRequest(const QJsonValu }else if(act=="destroybe"){ ok = true; out->insert("destroybe", sysadm::BEADM::destroyBE(in_args.toObject())); - } + } } //end of "action" key usage //If nothing done - return the proper code @@ -433,6 +433,10 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmIocageRequest(const QJsonVal bool ok = false; if(keys.contains("action")){ QString act = JsonValueToString(in_args.toObject().value("action")); + if(act=="clonejail"){ + ok = true; + out->insert("clonejail", sysadm::Iocage::cloneJail(in_args.toObject())); + } if(act=="cleanall"){ ok = true; out->insert("cleanall", sysadm::Iocage::cleanAll()); diff --git a/src/server/library/sysadm-iocage.cpp b/src/server/library/sysadm-iocage.cpp index 36c35fa..9b0133b 100644 --- a/src/server/library/sysadm-iocage.cpp +++ b/src/server/library/sysadm-iocage.cpp @@ -12,6 +12,46 @@ using namespace sysadm; //PLEASE: Keep the functions in the same order as listed in pcbsd-general.h +// Clone a jail on the box +QJsonObject Iocage::cloneJail(QJsonObject jsin) { + QJsonObject retObject; + + QStringList keys = jsin.keys(); + if (! keys.contains("jail") ) { + retObject.insert("error", "Missing required keys"); + return retObject; + } + + // Get the key values + QString jail = jsin.value("jail").toString(); + QString props = jsin.value("props").toString(); + + QStringList output = General::RunCommand("iocage clone " + jail + " " + props).split("\n"); + + QJsonObject vals; + for ( int i = 0; i < output.size(); i++) + { + if ( output.at(i).isEmpty() ) + break; + + if ( output.at(i).indexOf("ERROR:") != -1 ) { + retObject.insert("error", output.at(i)); + return retObject; + } else { + QString key = output.at(i).simplified().section(":", 0, 0); + QString value = output.at(i).simplified().section(":", 1, 1); + + vals.insert(key, value); + } + } + + retObject.insert("jail", jail); + retObject.insert("props", props); + retObject.insert("success", vals); + + return retObject; +} + // Clean everything iocage related on a box QJsonObject Iocage::cleanAll() { QJsonObject retObject; diff --git a/src/server/library/sysadm-iocage.h b/src/server/library/sysadm-iocage.h index 0497f16..e3e6471 100644 --- a/src/server/library/sysadm-iocage.h +++ b/src/server/library/sysadm-iocage.h @@ -14,6 +14,7 @@ namespace sysadm{ class Iocage{ public: + static QJsonObject cloneJail(QJsonObject); static QJsonObject cleanAll(); static QJsonObject cleanTemplates(); static QJsonObject cleanReleases();