From 1ba65b33880e2298ade3e5cc4f2718aa6112e44f Mon Sep 17 00:00:00 2001 From: Kris Moore Date: Fri, 5 Feb 2016 11:02:47 -0500 Subject: [PATCH] Add new API class and call for 'beadm', with the initial listbes API call REST Request: ------------------------------- PUT /sysadm/beadm { "action" : "listbes" } WebSocket Request: ------------------------------- { "name" : "beadm", "namespace" : "sysadm", "id" : "fooid", "args" : { "action" : "listbes" } } Response: ------------------------------- { "args": { "listbes": { "11.0-CURRENTJAN2016-up-20160128_150853": { "active": "NR", "date": "2016-01-28", "mount": "/", "nick": "14:57", "space": "10.2G" }, "initial": { "active": "-", "date": "2016-01-28", "mount": "-", "nick": "07:00", "space": "1.2G" } } }, "id": "fooid", "name": "response", "namespace": "sysadm" } --- .gitignore | 55 +++++++++++++++++++---------- src/server/WebBackend.cpp | 31 ++++++++++++++++ src/server/WebSocket.h | 2 ++ src/server/library/library.pri | 2 ++ src/server/library/sysadm-beadm.cpp | 49 +++++++++++++++++++++++++ src/server/library/sysadm-beadm.h | 22 ++++++++++++ 6 files changed, 142 insertions(+), 19 deletions(-) create mode 100644 src/server/library/sysadm-beadm.cpp create mode 100644 src/server/library/sysadm-beadm.h diff --git a/.gitignore b/.gitignore index ce0fb10..a423326 100644 --- a/.gitignore +++ b/.gitignore @@ -1,43 +1,60 @@ -src/Makefile -src/binary/Makefile src/binary/main.o +src/binary/Makefile src/binary/sysadm -src/library/Makefile -src/library/NetDevice.o src/library/libsysadm.so src/library/libsysadm.so.1 src/library/libsysadm.so.1.0 src/library/libsysadm.so.1.0.0 +src/library/Makefile +src/library/NetDevice.o +src/library/sysadm-firewall.o src/library/sysadm-general.o src/library/sysadm-lifepreserver.o src/library/sysadm-network.o -src/library/sysadm-firewall.o src/library/sysadm-servicemanager.o src/library/sysadm-systeminfo.o src/library/sysadm-update.o src/library/sysadm-usermanager.o +src/Makefile src/server/AuthorizationManager.o -src/server/Makefile -src/server/WebBackend.o -src/server/WebServer.o -src/server/WebSocket.o src/server/dispatcher-client.o +src/server/Dispatcher.o +src/server/EventWatcher.o +src/server/LogManager.o src/server/main.o +src/server/Makefile src/server/moc_AuthorizationManager.cpp src/server/moc_AuthorizationManager.o -src/server/moc_WebServer.cpp -src/server/moc_WebServer.o -src/server/moc_WebSocket.cpp -src/server/moc_WebSocket.o src/server/moc_dispatcher-client.cpp src/server/moc_dispatcher-client.o -src/server/moc_syscache-client.cpp -src/server/moc_syscache-client.o -src/server/sysadm-server -src/server/syscache-client.o -src/server/EventWatcher.o +src/server/moc_Dispatcher.cpp +src/server/moc_Dispatcher.o src/server/moc_EventWatcher.cpp src/server/moc_EventWatcher.o src/server/moc_SslServer.cpp src/server/moc_SslServer.o - +src/server/moc_syscache-client.cpp +src/server/moc_syscache-client.o +src/server/moc_WebServer.cpp +src/server/moc_WebServer.o +src/server/moc_WebSocket.cpp +src/server/moc_WebSocket.o +src/server/NetDevice.o +src/server/sysadm-beadm.o +src/server/sysadm-firewall.o +src/server/sysadm-general.o +src/server/sysadm-iocage.o +src/server/sysadm-iohyve.o +src/server/sysadm-lifepreserver.o +src/server/sysadm-network.o +src/server/sysadm-server +src/server/sysadm-servicemanager.o +src/server/sysadm-systeminfo.o +src/server/sysadm-systemmanager.o +src/server/sysadm-update.o +src/server/sysadm-usermanager.o +src/server/syscache-client.o +src/server/WebBackend.o +src/server/WebServer.o +src/server/WebSocket.o +tests/node_modules/ diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index 08d60af..024f9ce 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -9,6 +9,7 @@ #include //sysadm library interface classes +#include "library/sysadm-beadm.h" #include "library/sysadm-general.h" #include "library/sysadm-iocage.h" #include "library/sysadm-iohyve.h" @@ -36,6 +37,11 @@ RestOutputStruct::ExitCode WebSocket::AvailableSubsystems(bool allaccess, QJsonO out->insert("rpc/syscache","read"); //no write to syscache - only reads } + // - beadm + 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 out->insert("rpc/dispatcher", allaccess ? "read/write" : "read"); @@ -90,6 +96,8 @@ RestOutputStruct::ExitCode WebSocket::EvaluateBackendRequest(const RestInputStru //Go through and forward this request to the appropriate sub-system if(namesp=="rpc" && name=="dispatcher"){ return EvaluateDispatcherRequest(IN.fullaccess, IN.args, out); + }else if(namesp=="sysadm" && name=="beadm"){ + return EvaluateSysadmBEADMRequest(IN.args, out); }else if(namesp=="sysadm" && name=="iocage"){ return EvaluateSysadmIocageRequest(IN.args, out); }else if(namesp=="sysadm" && name=="iohyve"){ @@ -182,6 +190,29 @@ RestOutputStruct::ExitCode WebSocket::EvaluateDispatcherRequest(bool allaccess, return RestOutputStruct::OK; } +//==== SYSADM -- BEADM ==== +RestOutputStruct::ExitCode WebSocket::EvaluateSysadmBEADMRequest(const QJsonValue in_args, QJsonObject *out){ + if(in_args.isObject()){ + QStringList keys = in_args.toObject().keys(); + bool ok = false; + if(keys.contains("action")){ + QString act = JsonValueToString(in_args.toObject().value("action")); + if(act=="listbes"){ + ok = true; + out->insert("listbes", sysadm::BEADM::listBEs()); + } + } //end of "action" key usage + + //If nothing done - return the proper code + if(!ok){ + return RestOutputStruct::BADREQUEST; + } + }else{ // if(in_args.isArray()){ + return RestOutputStruct::BADREQUEST; + } + return RestOutputStruct::OK; +} + //==== SYSADM -- Network ==== RestOutputStruct::ExitCode WebSocket::EvaluateSysadmNetworkRequest(const QJsonValue in_args, QJsonObject *out){ if(in_args.isObject()){ diff --git a/src/server/WebSocket.h b/src/server/WebSocket.h index 8981b14..4547a69 100644 --- a/src/server/WebSocket.h +++ b/src/server/WebSocket.h @@ -46,6 +46,8 @@ private: // -- Individual subsystems RestOutputStruct::ExitCode EvaluateSyscacheRequest(const QJsonValue in_args, QJsonObject *out); RestOutputStruct::ExitCode EvaluateDispatcherRequest(bool allaccess, const QJsonValue in_args, QJsonObject *out); + // -- sysadm beadm API + RestOutputStruct::ExitCode EvaluateSysadmBEADMRequest(const QJsonValue in_args, QJsonObject *out); // -- sysadm iocage API RestOutputStruct::ExitCode EvaluateSysadmIocageRequest(const QJsonValue in_args, QJsonObject *out); // -- sysadm iohyve API diff --git a/src/server/library/library.pri b/src/server/library/library.pri index dfc9b8d..53cb45e 100644 --- a/src/server/library/library.pri +++ b/src/server/library/library.pri @@ -3,6 +3,7 @@ CONFIG += c++11 HEADERS += $${PWD}/sysadm-global.h \ $${PWD}/sysadm-general.h \ + $${PWD}/sysadm-beadm.h \ $${PWD}/sysadm-iocage.h \ $${PWD}/sysadm-iohyve.h \ $${PWD}/sysadm-lifepreserver.h \ @@ -15,6 +16,7 @@ HEADERS += $${PWD}/sysadm-global.h \ SOURCES += $${PWD}/NetDevice.cpp \ $${PWD}/sysadm-general.cpp \ + $${PWD}/sysadm-beadm.cpp \ $${PWD}/sysadm-iocage.cpp \ $${PWD}/sysadm-iohyve.cpp \ $${PWD}/sysadm-lifepreserver.cpp \ diff --git a/src/server/library/sysadm-beadm.cpp b/src/server/library/sysadm-beadm.cpp new file mode 100644 index 0000000..50509a3 --- /dev/null +++ b/src/server/library/sysadm-beadm.cpp @@ -0,0 +1,49 @@ +//=========================================== +// PC-BSD source code +// Copyright (c) 2015, PC-BSD Software/iXsystems +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include +#include "sysadm-general.h" +#include "sysadm-beadm.h" +#include "sysadm-global.h" +#include "globals.h" + +using namespace sysadm; + +//PLEASE: Keep the functions in the same order as listed in pcbsd-general.h + +// List all the available BEs +QJsonObject BEADM::listBEs() { + QJsonObject retObject; + + QStringList output = General::RunCommand("beadm list -H").split("\n"); + + for ( int i = 0; i < output.size(); i++) + { + + if ( output.at(i).isEmpty() ) + break; + + QString line = output.at(i).simplified(); + + QString beName = line.section(" ", 0, 0); + QString beActive = line.section(" ", 1, 1); + QString beMount = line.section(" ", 2, 2); + QString beSpace = line.section(" ", 3, 3); + QString beDate = line.section(" ", 4, 4); + QString beNick = line.section(" ", 5, 5); + + QJsonObject vals; + vals.insert("active", beActive); + vals.insert("mount", beMount); + vals.insert("space", beSpace); + vals.insert("date", beDate); + vals.insert("nick", beNick); + + retObject.insert(beName, vals); + } + + return retObject; +} diff --git a/src/server/library/sysadm-beadm.h b/src/server/library/sysadm-beadm.h new file mode 100644 index 0000000..6a0d978 --- /dev/null +++ b/src/server/library/sysadm-beadm.h @@ -0,0 +1,22 @@ +//=========================================== +// PC-BSD source code +// Copyright (c) 2015, PC-BSD Software/iXsystems +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#ifndef __PCBSD_LIB_UTILS_BEADM_H +#define __PCBSD_LIB_UTILS_BEADM_H + +#include +#include "sysadm-global.h" + +namespace sysadm{ + +class BEADM{ +public: + static QJsonObject listBEs(); +}; + +} //end of pcbsd namespace + +#endif