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"
}
This commit is contained in:
Kris Moore
2016-02-05 11:02:47 -05:00
parent 24295f65a1
commit 1ba65b3388
6 changed files with 142 additions and 19 deletions

55
.gitignore vendored
View File

@@ -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/

View File

@@ -9,6 +9,7 @@
#include <WebSocket.h>
//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()){

View File

@@ -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

View File

@@ -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 \

View File

@@ -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 <QUuid>
#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;
}

View File

@@ -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 <QJsonObject>
#include "sysadm-global.h"
namespace sysadm{
class BEADM{
public:
static QJsonObject listBEs();
};
} //end of pcbsd namespace
#endif