diff --git a/port-files/Makefile b/port-files/Makefile new file mode 100644 index 0000000..e9c32d9 --- /dev/null +++ b/port-files/Makefile @@ -0,0 +1,33 @@ +# Created by: Kris Moore +# $FreeBSD$ + +PORTNAME= pcbsd-sysadm +PORTVERSION= %%CHGVERSION%% +CATEGORIES= sysutils + +MAINTAINER= kmoore@FreeBSD.org +COMMENT= PC-BSD SysAdm API server + +LICENSE= BSD3CLAUSE + +RUN_DEPENDS= sipcalc:${PORTSDIR}/net-mgmt/sipcalc \ + eject:${PORTSDIR}/sysutils/eject \ + unzip:${PORTSDIR}/archivers/unzip + +WRKSRC_SUBDIR= src +USE_QT5= core network buildtools qmake +USES= pkgconfig tar:xz qmake +MAKE_ARGS= PREFIX=${STAGEDIR}${PREFIX} + +USE_GITHUB= yes +GH_ACCOUNT= pcbsd +GH_PROJECT= sysadm +GH_TAGNAME= %%GHTAG%% + +.include + +.if ${OSVERSION} < 1000000 +IGNORE= requires FreeBSD 10 or later +.endif + +.include diff --git a/port-files/distinfo b/port-files/distinfo new file mode 100644 index 0000000..ee4e3b8 --- /dev/null +++ b/port-files/distinfo @@ -0,0 +1,2 @@ +SHA256 (pcbsd-sysadm-20151217-5583f4d2c00d8326b44f7d39eefd0a90276d7a74_GH0.tar.xz) = 00972329b84a6a4bab0c9bde2ee3f513ce7bdf9a9ef1b3b496241cd4ddf20c54 +SIZE (pcbsd-sysadm-20151217-5583f4d2c00d8326b44f7d39eefd0a90276d7a74_GH0.tar.xz) = 37757 diff --git a/port-files/pkg-descr b/port-files/pkg-descr new file mode 100644 index 0000000..0d3fd26 --- /dev/null +++ b/port-files/pkg-descr @@ -0,0 +1,3 @@ +PC-BSD SysAdm utility and websocket server + +WWW: https://github.com/pcbsd/sysadm diff --git a/port-files/pkg-plist b/port-files/pkg-plist new file mode 100644 index 0000000..87ca073 --- /dev/null +++ b/port-files/pkg-plist @@ -0,0 +1,11 @@ +bin/sysadm +bin/sysadm-server +etc/rc.d/sysadm +include/sysadm-general.h +include/sysadm-global.h +include/sysadm-lifepreserver.h +include/sysadm-network.h +%%QT_LIBDIR%%/%%QT_LIBDIR%%sysadm.so +%%QT_LIBDIR%%/%%QT_LIBDIR%%sysadm.so.1 +%%QT_LIBDIR%%/%%QT_LIBDIR%%sysadm.so.1.0 +%%QT_LIBDIR%%/%%QT_LIBDIR%%sysadm.so.1.0.0 diff --git a/src/rc.d/sysadm b/src/rc.d/sysadm new file mode 100755 index 0000000..9aef8b8 --- /dev/null +++ b/src/rc.d/sysadm @@ -0,0 +1,41 @@ +#!/bin/sh +# $FreeBSD$ + +# PROVIDE: sysadm +# REQUIRE: LOGIN cleanvar +# KEYWORD: shutdown + +# +# Add the following lines to /etc/rc.conf to enable sysadm: +# sysadm_enable (bool): Set to "NO" by default. +# Set it to "YES" to enable sysadm + +. /etc/rc.subr + +name="sysadm" +rcvar=sysadm_enable + +command="/usr/local/bin/sysadm-server" +start_cmd="sysadm_start" +stop_cmd="sysadm_stop" + +[ -z "$sysadm_enable" ] && sysadm_enable="NO" + +load_rc_config $name + +sysadm_stop() +{ + if [ -e "/var/run/sysadm.pid" ] ; then + pkill -9 -F /var/run/sysadm.pid + fi +} + +sysadm_start() +{ + export PATH="${PATH}:/usr/local/bin:/usr/local/sbin" + sysadm_stop + echo "Starting sysadm..." + daemon -p /var/run/sysadm.pid $command $flags >/dev/null 2>/dev/null +} + +run_rc_command "$1" diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index 66801a5..ea75cd0 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -6,8 +6,8 @@ #include //sysadm library interface classes -#include -#include +#include "sysadm-general.h" +#include "sysadm-network.h" #include "syscache-client.h" #include "dispatcher-client.h" @@ -16,53 +16,69 @@ #define SCLISTDELIM QString("::::") //SysCache List Delimiter void WebSocket::EvaluateBackendRequest(QString name, const QJsonValue args, QJsonObject *out){ - QJsonObject obj; //output object - if(args.isObject()){ - //For the moment: all arguments are full syscache DB calls - no special ones - QStringList reqs = args.toObject().keys(); - if(!reqs.isEmpty()){ - if(DEBUG){ qDebug() << "Parsing Inputs:" << reqs; } - for(int r=0; rinsert(req, QJsonValue(values.join("")) ); } - else{ - //This is an array of outputs - QJsonArray arr; - for(int i=0; iinsert(req,arr); - } - } - } //end of special "request" objects - }else if(args.isArray()){ - QStringList inputs = JsonArrayToStringList(args.toArray()); - if(DEBUG){ qDebug() << "Parsing Array inputs:" << inputs; } - QStringList values; - if(name.toLower()=="syscache"){values = SysCacheClient::parseInputs( inputs ); } - else if(name.toLower()=="dispatcher"){values = DispatcherClient::parseInputs( inputs , AUTHSYSTEM); } - if(DEBUG){ qDebug() << " - Returns:" << values; } - for(int i=0; iinsert(inputs[i],arr); + out->insert(in_req[i],arr); }else{ - out->insert(inputs[i],values[i]); + out->insert(in_req[i],values[i]); } } - } //end array of inputs - -} \ No newline at end of file + //Return Success + return RestOutputStruct::OK; +} + +RestOutputStruct::ExitCode WebSocket::EvaluateDispatcherRequest(const QJsonValue in_args, QJSonObject *out){ + //dispatcher only needs a list of sub-commands at the moment (might change later) + QStringList in_req; + + //Parse the input arguments structure + if(args.isArray()){ in_req = JsonArrayToStringList(args.toArray()); } + else if(args.isObject()){ + QStringList keys = arg.toObject().keys(); + for(int i=0; iinsert(in_req[i],values[i]); } + //Return Success + return RestOutputStruct::OK; +} + diff --git a/src/server/WebServer.cpp b/src/server/WebServer.cpp index a313318..744a596 100644 --- a/src/server/WebServer.cpp +++ b/src/server/WebServer.cpp @@ -192,4 +192,4 @@ void WebServer::WatcherUpdate(QString path){ if(!watcher->files().contains(path) && !watcher->directories().contains(path)){ watcher->addPath(path); //re-add it to the watcher. This happens when the file is removed/re-created instead of just overwritten } -} \ No newline at end of file +} diff --git a/src/server/WebSocket.h b/src/server/WebSocket.h index cde25df..f518820 100644 --- a/src/server/WebSocket.h +++ b/src/server/WebSocket.h @@ -48,7 +48,9 @@ private: void SetOutputError(QJsonObject *ret, QString id, int err, QString msg); //Backend request/reply functions (contained in WebBackend.cpp) - void EvaluateBackendRequest(QString name, const QJsonValue in_args, QJsonObject *out); + RestOutputStruct::ExitCode EvaluateBackendRequest(QString name, const QJsonValue in_args, QJsonObject *out); + RestOutputStruct::ExitCode EvaluateSyscacheRequest(const QJsonValue in_args, QJsonObject *out); + RestOutputStruct::ExitCode EvaluateDispatcherRequest(const QJsonValue in_args, QJsonObject *out); private slots: void checkIdle(); //see if the currently-connected client is idle diff --git a/src/server/server.pro b/src/server/server.pro index 73e8b0f..46bb74e 100644 --- a/src/server/server.pro +++ b/src/server/server.pro @@ -27,7 +27,6 @@ target.path=/usr/local/bin INSTALLS += target -QMAKE_LIBDIR = /usr/local/lib/qt5 /usr/local/lib - -INCLUDEPATH += /usr/local/include -LIBS += -L../library -L/usr/local/lib -lpam -lutil -lsysadm \ No newline at end of file +QMAKE_LIBDIR = ../library /usr/local/lib/qt5 /usr/local/lib +INCLUDEPATH += ../library /usr/local/include +LIBS += -L../library -L/usr/local/lib -lpam -lutil -lsysadm diff --git a/src/sysadm.pro b/src/sysadm.pro index dcf3d96..7ad5e04 100644 --- a/src/sysadm.pro +++ b/src/sysadm.pro @@ -7,3 +7,7 @@ SUBDIRS+= library binary server binary.depends = library server.depends = library +rcd.path = /usr/local/etc/rc.d/ +rcd.extra = cp rc.d/* $(INSTALL_ROOT)/usr/local/etc/rc.d/ + +INSTALLS += rcd