diff --git a/.gitignore b/.gitignore index 469ee90..f43bafc 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,9 @@ src/library/libsysadm.so.1.0.0 src/library/sysadm-general.o src/library/sysadm-lifepreserver.o src/library/sysadm-network.o +src/library/sysadm-firewall.o +src/library/sysadm-update.o +src/library/sysadm-usermanager.o src/server/AuthorizationManager.o src/server/Makefile src/server/WebBackend.o @@ -28,4 +31,9 @@ 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_EventWatcher.cpp +src/server/moc_EventWatcher.o +src/server/moc_SslServer.cpp +src/server/moc_SslServer.o diff --git a/src/library/library.pro b/src/library/library.pro index c08f0aa..11b2c23 100644 --- a/src/library/library.pro +++ b/src/library/library.pro @@ -10,19 +10,21 @@ TEMPLATE = lib LANGUAGE = C++ VERSION = 1.0.0 -HEADERS += sysadm-global.h \ +HEADERS += sysadm-global.h \ sysadm-general.h \ sysadm-lifepreserver.h \ sysadm-network.h \ - sysadm-firewall.h \ - sysadm-usermanager.h + sysadm-firewall.h \ + sysadm-update.h \ + sysadm-usermanager.h -SOURCES += sysadm-general.cpp \ +SOURCES += NetDevice.cpp \ + sysadm-general.cpp \ sysadm-lifepreserver.cpp \ sysadm-network.cpp \ - NetDevice.cpp \ - sysadm-firewall.cpp \ - sysadm-usermanager.cpp + sysadm-firewall.cpp \ + sysadm-update.cpp \ + sysadm-usermanager.cpp include.path=/usr/local/include/ include.files=sysadm-*.h diff --git a/src/library/sysadm-update.cpp b/src/library/sysadm-update.cpp new file mode 100644 index 0000000..6791644 --- /dev/null +++ b/src/library/sysadm-update.cpp @@ -0,0 +1,70 @@ +//=========================================== +// 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 "sysadm-general.h" +#include "sysadm-update.h" +#include "sysadm-global.h" + +using namespace sysadm; + +//PLEASE: Keep the functions in the same order as listed in pcbsd-general.h + +// Return a list of updates available +QJsonObject Update::checkUpdates() { + QJsonObject retObject; + + QStringList output = General::RunCommand("pc-updatemanager check").split("\n"); + QString nameval; + + for ( int i = 0; i < output.size(); i++) + { + if ( output.at(i).indexOf("Your system is up to date!") != -1 ) + { + retObject.insert("status", "noupdates"); + return retObject; + } + if ( output.at(i).indexOf("NAME: ") != -1 ) + nameval = output.at(i).section(" ", 1, 1); + + if ( output.at(i).indexOf("TYPE: SECURITYUPDATE") != -1 ) { + QJsonObject itemvals; + itemvals.insert("name", nameval); + retObject.insert("security", itemvals); + } + if ( output.at(i).indexOf("TYPE: SYSTEMUPDATE") != -1 ) { + QJsonObject itemvals; + itemvals.insert("name", nameval); + if ( output.size() > ( i + 1) ) + itemvals.insert("tag", output.at(i+1).section(" ", 1, 1)); + if ( output.size() > ( i + 2) ) + itemvals.insert("version", output.at(i+2).section(" ", 1, 1)); + retObject.insert("majorupgrade", itemvals); + } + if ( output.at(i).indexOf("TYPE: PATCH") != -1 ) { + QJsonObject itemvals; + itemvals.insert("name", nameval); + if ( output.size() > ( i + 1) ) + itemvals.insert("tag", output.at(i+1).section(" ", 1, 1)); + if ( output.size() > ( i + 2) ) + itemvals.insert("details", output.at(i+2).section(" ", 1, 1)); + if ( output.size() > ( i + 3) ) + itemvals.insert("date", output.at(i+3).section(" ", 1, 1)); + if ( output.size() > ( i + 4) ) + itemvals.insert("size", output.at(i+4).section(" ", 1, 1)); + retObject.insert("patch", itemvals); + } + if ( output.at(i).indexOf("TYPE: PKGUPDATE") != -1 ) { + QJsonObject itemvals; + itemvals.insert("name", nameval); + retObject.insert("packageupdate", itemvals); + } + } + + // Update status that we have updates + retObject.insert("status", "updatesavailable"); + + return retObject; +} diff --git a/src/library/sysadm-update.h b/src/library/sysadm-update.h new file mode 100644 index 0000000..f2a9284 --- /dev/null +++ b/src/library/sysadm-update.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_UPDATER_H +#define __PCBSD_LIB_UTILS_UPDATER_H + +#include +#include "sysadm-global.h" + +namespace sysadm{ + +class Update{ +public: + static QJsonObject checkUpdates(); +}; + +} //end of pcbsd namespace + +#endif diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index 228330b..1bb4f81 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -10,8 +10,9 @@ //sysadm library interface classes #include "sysadm-general.h" -#include "sysadm-network.h" #include "sysadm-lifepreserver.h" +#include "sysadm-network.h" +#include "sysadm-update.h" #include "syscache-client.h" #include "dispatcher-client.h" @@ -66,6 +67,8 @@ RestOutputStruct::ExitCode WebSocket::EvaluateBackendRequest(const RestInputStru return EvaluateSysadmNetworkRequest(IN.args, out); }else if(namesp=="sysadm" && name=="lifepreserver"){ return EvaluateSysadmLifePreserverRequest(IN.args, out); + }else if(namesp=="sysadm" && name=="update"){ + return EvaluateSysadmUpdateRequest(IN.args, out); }else{ return RestOutputStruct::BADREQUEST; } @@ -241,3 +244,27 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmLifePreserverRequest(const Q } return RestOutputStruct::OK; } + +//==== SYSADM -- Update ==== +RestOutputStruct::ExitCode WebSocket::EvaluateSysadmUpdateRequest(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=="checkupdates"){ + ok = true; + out->insert("checkupdates", sysadm::Update::checkUpdates()); + } + + } //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; +} diff --git a/src/server/WebSocket.h b/src/server/WebSocket.h index b173562..a4a45ae 100644 --- a/src/server/WebSocket.h +++ b/src/server/WebSocket.h @@ -50,6 +50,8 @@ private: RestOutputStruct::ExitCode EvaluateSysadmNetworkRequest(const QJsonValue in_args, QJsonObject *out); // -- sysadm LifePreserver API RestOutputStruct::ExitCode EvaluateSysadmLifePreserverRequest(const QJsonValue in_args, QJsonObject *out); + // -- sysadm Update API + RestOutputStruct::ExitCode EvaluateSysadmUpdateRequest(const QJsonValue in_args, QJsonObject *out); private slots: void checkIdle(); //see if the currently-connected client is idle