From f58eb8ce0849e63b856d33517439db32cb968dc4 Mon Sep 17 00:00:00 2001 From: JoshDW19 Date: Tue, 9 Feb 2016 11:49:39 -0500 Subject: [PATCH] New API call for creating a new boot environment. An optional flag is shown below. By specifying clonefrom which passes along the -e flag it will clone from a inactive boot environment. REST Request: ------------------------------- PUT /sysadm/beadm { "action" : "createbe", "newbe" : "red", "clonefrom" : "green" } WebSocket Request: ------------------------------- { "id" : "fooid", "args" : { "newbe" : "red", "clonefrom" : "green", "action" : "createbe" }, "namespace" : "sysadm", "name" : "beadm" } Response: ------------------------------- { "args": { "createbe": { "clonefrom": "green", "newbe": "red" } }, "id": "fooid", "name": "response", "namespace": "sysadm" } --- src/server/WebBackend.cpp | 5 +++- src/server/library/sysadm-beadm.cpp | 37 +++++++++++++++++++++++++++++ src/server/library/sysadm-beadm.h | 1 + 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index 276bdec..b0c0f87 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -91,7 +91,7 @@ RestOutputStruct::ExitCode WebSocket::EvaluateBackendRequest(const RestInputStru }else{ QJsonObject avail; AvailableSubsystems(IN.fullaccess, &avail); - if(!avail.contains(namesp+"/"+name)){ return RestOutputStruct::BADREQUEST; } + if(!avail.contains(namesp+"/"+name)){ return RestOutputStruct::NOTFOUND; } } //Go through and forward this request to the appropriate sub-system @@ -207,6 +207,9 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmBEADMRequest(const QJsonValu }else if(act=="activatebe"){ ok = true; out->insert("activatebe", sysadm::BEADM::activateBE(in_args.toObject())); + }else if(act=="createbe"){ + ok = true; + out->insert("createbe", sysadm::BEADM::createBE(in_args.toObject())); } } //end of "action" key usage diff --git a/src/server/library/sysadm-beadm.cpp b/src/server/library/sysadm-beadm.cpp index 4dd92e8..92d2ac1 100644 --- a/src/server/library/sysadm-beadm.cpp +++ b/src/server/library/sysadm-beadm.cpp @@ -105,4 +105,41 @@ QJsonObject BEADM::activateBE(QJsonObject jsin) { retObject.insert("target", target); return retObject; +} + +// createbe (optional flag -e for cloning from an inactive BE) : Create a new Boot environment + +QJsonObject BEADM::createBE(QJsonObject jsin) { + QJsonObject retObject; + + QStringList keys = jsin.keys(); + if (! keys.contains("newbe") ) { + retObject.insert("error", "Missing required key(s) 'target'"); + return retObject; + } + + // Get the key values + + QString newbe = jsin.value("newbe").toString(); + QString flags; + if ( keys.contains("clonefrom") ) { + flags = "-e " + jsin.value("clonefrom").toString(); + } + + QStringList output = General::RunCommand("beadm create " + flags + " " + newbe).split("\n"); + + for ( int i = 0; i < output.size(); i++) + { + if ( output.at(i).indexOf("ERROR") != -1 ) { + retObject.insert("error", output.at(i)); + return retObject; + } + } + + retObject.insert("newbe", newbe); + if ( keys.contains("clonefrom") ) { + retObject.insert("clonefrom", jsin.value("clonefrom").toString()); + } + return retObject; + } \ No newline at end of file diff --git a/src/server/library/sysadm-beadm.h b/src/server/library/sysadm-beadm.h index c3c4f9c..d113889 100644 --- a/src/server/library/sysadm-beadm.h +++ b/src/server/library/sysadm-beadm.h @@ -17,6 +17,7 @@ public: static QJsonObject listBEs(); static QJsonObject renameBE(QJsonObject); static QJsonObject activateBE(QJsonObject); + static QJsonObject createBE(QJsonObject); }; } //end of pcbsd namespace