From 25eac09ce93da1ebf99ade2bca95c3b077a25ac6 Mon Sep 17 00:00:00 2001 From: dlavigne Date: Thu, 21 Apr 2016 13:37:59 -0400 Subject: [PATCH 1/4] Doc createsnap action. --- api/classes/lifepreserver.rst | 56 ++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/api/classes/lifepreserver.rst b/api/classes/lifepreserver.rst index 133a4d0..9c09138 100644 --- a/api/classes/lifepreserver.rst +++ b/api/classes/lifepreserver.rst @@ -20,7 +20,7 @@ Every lifepreserver class request contains the following parameters: | namespace | sysadm | | | | | | +---------------------------------+---------------+----------------------------------------------------------------------------------------------------------------------+ -| action | | supported actions include "listcron", "cronsnap", "cronscrub", "listsnap", "revertsnap", "removesnap", | +| action | | supported actions include "listcron", "cronsnap", "cronscrub", "createsnap", "listsnap", "revertsnap", "removesnap", | | | | "addreplication", "removereplication", "listreplication", "runreplication", "initreplication", "settings", and | | | | "savesettings" | | | | | @@ -255,6 +255,60 @@ The "cronscrub" action is used to schedule a ZFS scrub. This action supports the "name": "response", "namespace": "sysadm" } + +.. index:: createsnap, Life Preserver + +.. _Create a Snapshot: + +Create a Snapshot +================= + +The "createsnap" action creates a one-time snapshot of the specified dataset. + +**REST Request** + +.. code-block:: json + + PUT /sysadm/lifepreserver + { + "snap" : "mytestsnap", + "dataset" : "tank", + "comment" : "Testing", + "action" : "createsnap" + } + +**WebSocket Request** + +.. code-block:: json + + { + "args" : { + "comment" : "Testing", + "dataset" : "tank", + "action" : "createsnap", + "snap" : "mytestsnap" + }, + "name" : "lifepreserver", + "namespace" : "sysadm", + "id" : "fooid" + } + +**Response** + +.. code-block:: json + + { + "args": { + "createsnap": { + "comment": "Testing", + "dataset": "tank", + "snap": "mytestsnap" + } + }, + "id": "fooid", + "name": "response", + "namespace": "sysadm" + } .. index:: listsnap, Life Preserver From cf1c16de27bacf60484078a9870705274b68d896 Mon Sep 17 00:00:00 2001 From: dlavigne Date: Thu, 21 Apr 2016 13:45:16 -0400 Subject: [PATCH 2/4] Doc datasets action. --- api/classes/zfs.rst | 271 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 270 insertions(+), 1 deletion(-) diff --git a/api/classes/zfs.rst b/api/classes/zfs.rst index 7f5ecff..e1c2ed8 100644 --- a/api/classes/zfs.rst +++ b/api/classes/zfs.rst @@ -20,7 +20,7 @@ Every zfs class request contains the following parameters: | namespace | sysadm | | | | | | +---------------------------------+---------------+----------------------------------------------------------------------------------------------------------------------+ -| action | | supported actions include "list_pools" | +| action | | supported actions include "list_pools", "datasets" | | | | | +---------------------------------+---------------+----------------------------------------------------------------------------------------------------------------------+ @@ -83,3 +83,272 @@ space, pool health, and total size. This action is the equivalent of running :co "name": "response", "namespace": "sysadm" } + +.. index:: datasets, zfs + +.. _List Datasets: + +List Datasets +============= + +The "datasets" action lists the ZFS datasets on the specified pool. + +**REST Request** + +.. code-block:: json + + PUT /sysadm/zfs + { + "action" : "datasets", + "zpool" : "tank" + } + +**WebSocket Request** + +.. code-block:: json + + { + "namespace" : "sysadm", + "id" : "fooid", + "args" : { + "action" : "datasets", + "zpool" : "tank" + }, + "name" : "zfs" + } + +**Response** + +.. code-block:: json + + { + "args": { + "datasets": { + "tank": { + "avail": "320G", + "mountpoint": "none", + "refer": "96K", + "used": "125G" + }, + "tank/ROOT": { + "avail": "320G", + "mountpoint": "none", + "refer": "96K", + "used": "63.7G" + }, + "tank/ROOT/11.0-CURRENTAPRIL2016-up-20160418_124146": { + "avail": "320G", + "mountpoint": "/", + "refer": "34.7G", + "used": "63.7G" + }, + "tank/ROOT/11.0-CURRENTFEB2016-up-20160303_094216": { + "avail": "320G", + "mountpoint": "/", + "refer": "29.7G", + "used": "272K" + }, + "tank/ROOT/11.0-CURRENTMAR2016-up-20160304_102405": { + "avail": "320G", + "mountpoint": "/", + "refer": "30.5G", + "used": "248K" + }, + "tank/ROOT/11.0-CURRENTMAR2016-up-20160315_092952": { + "avail": "320G", + "mountpoint": "/", + "refer": "31.2G", + "used": "256K" + }, + "tank/ROOT/11.0-CURRENTMAR2016-up-20160318_090405": { + "avail": "320G", + "mountpoint": "/", + "refer": "34.7G", + "used": "280K" + }, + "tank/ROOT/initial": { + "avail": "320G", + "mountpoint": "/mnt", + "refer": "5.60G", + "used": "232K" + }, + "tank/iocage": { + "avail": "320G", + "mountpoint": "/iocage", + "refer": "152K", + "used": "1.13G" + }, + "tank/iocage/.defaults": { + "avail": "320G", + "mountpoint": "/iocage/.defaults", + "refer": "96K", + "used": "992K" + }, + "tank/iocage/download": { + "avail": "320G", + "mountpoint": "/iocage/download", + "refer": "96K", + "used": "203M" + }, + "tank/iocage/download/10.2-RELEASE": { + "avail": "320G", + "mountpoint": "/iocage/download/10.2-RELEASE", + "refer": "202M", + "used": "202M" + }, + "tank/iocage/jails": { + "avail": "320G", + "mountpoint": "/iocage/jails", + "refer": "104K", + "used": "1000K" + }, + "tank/iocage/releases": { + "avail": "320G", + "mountpoint": "/iocage/releases", + "refer": "96K", + "used": "953M" + }, + "tank/iocage/releases/10.2-RELEASE": { + "avail": "320G", + "mountpoint": "/iocage/releases/10.2-RELEASE", + "refer": "96K", + "used": "952M" + }, + "tank/iocage/releases/10.2-RELEASE/root": { + "avail": "320G", + "mountpoint": "/iocage/releases/10.2-RELEASE/root", + "refer": "825M", + "used": "951M" + }, + "tank/iocage/templates": { + "avail": "320G", + "mountpoint": "/iocage/templates", + "refer": "96K", + "used": "992K" + }, + "tank/iohyve": { + "avail": "320G", + "mountpoint": "/iohyve", + "refer": "96K", + "used": "22.8G" + }, + "tank/iohyve/Firmware": { + "avail": "320G", + "mountpoint": "/iohyve/Firmware", + "refer": "96K", + "used": "992K" + }, + "tank/iohyve/ISO": { + "avail": "320G", + "mountpoint": "/iohyve/ISO", + "refer": "96K", + "used": "453M" + }, + "tank/iohyve/ISO/FreeBSD-10.1-RELEASE-amd64-bootonly.iso": { + "avail": "320G", + "mountpoint": "/iohyve/ISO/FreeBSD-10.1-RELEASE-amd64-bootonly.iso", + "refer": "219M", + "used": "220M" + }, + "tank/iohyve/ISO/FreeBSD-10.2-RELEASE-amd64-bootonly.iso": { + "avail": "320G", + "mountpoint": "/iohyve/ISO/FreeBSD-10.2-RELEASE-amd64-bootonly.iso", + "refer": "231M", + "used": "232M" + }, + "tank/iohyve/bsdguest": { + "avail": "320G", + "mountpoint": "/iohyve/bsdguest", + "refer": "96K", + "used": "22.4G" + }, + "tank/iohyve/bsdguest/disk0": { + "avail": "341G", + "mountpoint": "-", + "refer": "1.75G", + "used": "22.4G" + }, + "tank/tmp": { + "avail": "320G", + "mountpoint": "/tmp", + "refer": "2.95M", + "used": "18.3M" + }, + "tank/usr": { + "avail": "320G", + "mountpoint": "none", + "refer": "96K", + "used": "37.5G" + }, + "tank/usr/home": { + "avail": "320G", + "mountpoint": "/usr/home", + "refer": "96K", + "used": "27.8G" + }, + "tank/usr/home/kris": { + "avail": "320G", + "mountpoint": "/usr/home/kris", + "refer": "21.9G", + "used": "27.8G" + }, + "tank/usr/jails": { + "avail": "320G", + "mountpoint": "/usr/jails", + "refer": "96K", + "used": "992K" + }, + "tank/usr/obj": { + "avail": "320G", + "mountpoint": "/usr/obj", + "refer": "4.68G", + "used": "4.75G" + }, + "tank/usr/ports": { + "avail": "320G", + "mountpoint": "/usr/ports", + "refer": "2.20G", + "used": "2.96G" + }, + "tank/usr/src": { + "avail": "320G", + "mountpoint": "/usr/src", + "refer": "1.82G", + "used": "2.01G" + }, + "tank/var": { + "avail": "320G", + "mountpoint": "none", + "refer": "96K", + "used": "13.5M" + }, + "tank/var/audit": { + "avail": "320G", + "mountpoint": "/var/audit", + "refer": "96K", + "used": "992K" + }, + "tank/var/log": { + "avail": "320G", + "mountpoint": "/var/log", + "refer": "1.43M", + "used": "5.21M" + }, + "tank/var/mail": { + "avail": "320G", + "mountpoint": "/var/mail", + "refer": "120K", + "used": "1.21M" + }, + "tank/var/tmp": { + "avail": "320G", + "mountpoint": "/var/tmp", + "refer": "3.20M", + "used": "5.99M" + } + } + }, + "id": "fooid", + "name": "response", + "namespace": "sysadm" + } \ No newline at end of file From b2a4386c36ae4e9e1ca1e3a9975927689d7e4814 Mon Sep 17 00:00:00 2001 From: Kris Moore Date: Thu, 21 Apr 2016 14:54:12 -0400 Subject: [PATCH 3/4] Add a new 'fs' class to sysadm API, along with the initial "dirlist" command which will return a listing of the requested directory REST Request: ------------------------------- PUT /sysadm/fs { "dir" : "/root", "action" : "dirlist" } WebSocket Request: ------------------------------- { "args" : { "dir" : "/root", "action" : "dirlist" }, "id" : "fooid", "name" : "fs", "namespace" : "sysadm" } Response: ------------------------------- { "args": { "dirlist": { "VirtualBox VMs": { "dir": true }, "freenas-auto.iso": { "group": "wheel", "owner": "root", "size": 408049664 }, "ixbuild": { "dir": true }, "pc-sysinstall.cfg": { "group": "wheel", "owner": "root", "size": 1741 }, "pc-sysinstall.log": { "group": "wheel", "owner": "root", "size": 125408 } } }, "id": "fooid", "name": "response", "namespace": "sysadm" } --- src/server/WebBackend.cpp | 29 ++++++++++++ src/server/WebSocket.h | 2 + src/server/library/library.pri | 2 + src/server/library/sysadm-filesystem.cpp | 57 ++++++++++++++++++++++++ src/server/library/sysadm-filesystem.h | 23 ++++++++++ 5 files changed, 113 insertions(+) create mode 100644 src/server/library/sysadm-filesystem.cpp create mode 100644 src/server/library/sysadm-filesystem.h diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index a07dc0c..fb1fb6f 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -11,6 +11,7 @@ //sysadm library interface classes #include "library/sysadm-beadm.h" #include "library/sysadm-general.h" +#include "library/sysadm-filesystem.h" #include "library/sysadm-iocage.h" #include "library/sysadm-iohyve.h" #include "library/sysadm-lifepreserver.h" @@ -50,6 +51,9 @@ RestOutputStruct::ExitCode WebSocket::AvailableSubsystems(bool allaccess, QJsonO //"read" is the event notifications, "write" is the ability to queue up jobs out->insert("rpc/dispatcher", allaccess ? "read/write" : "read"); + // - filesystem + out->insert("sysadm/fs","read/write"); + // - network out->insert("sysadm/network","read/write"); @@ -114,6 +118,8 @@ RestOutputStruct::ExitCode WebSocket::EvaluateBackendRequest(const RestInputStru return EvaluateDispatcherRequest(IN.fullaccess, IN.args, out); }else if(namesp=="sysadm" && name=="beadm"){ return EvaluateSysadmBEADMRequest(IN.args, out); + }else if(namesp=="sysadm" && name=="fs"){ + return EvaluateSysadmFSRequest(IN.args, out); }else if(namesp=="sysadm" && name=="iocage"){ return EvaluateSysadmIocageRequest(IN.args, out); }else if(namesp=="sysadm" && name=="iohyve"){ @@ -286,6 +292,29 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmBEADMRequest(const QJsonValu return RestOutputStruct::OK; } +//==== SYSADM -- FS ==== +RestOutputStruct::ExitCode WebSocket::EvaluateSysadmFSRequest(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")).toLower(); + if(act=="dirlist"){ + ok = true; + out->insert("dirlist", sysadm::FS::list_dir(in_args.toObject())); + } + } //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 d127ef8..5cd1018 100644 --- a/src/server/WebSocket.h +++ b/src/server/WebSocket.h @@ -56,6 +56,8 @@ private: RestOutputStruct::ExitCode EvaluateDispatcherRequest(bool allaccess, const QJsonValue in_args, QJsonObject *out); // -- sysadm beadm API RestOutputStruct::ExitCode EvaluateSysadmBEADMRequest(const QJsonValue in_args, QJsonObject *out); + // -- sysadm FS API + RestOutputStruct::ExitCode EvaluateSysadmFSRequest(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 1b0fc54..44a46ec 100644 --- a/src/server/library/library.pri +++ b/src/server/library/library.pri @@ -4,6 +4,7 @@ CONFIG += c++11 HEADERS += $${PWD}/sysadm-global.h \ $${PWD}/sysadm-general.h \ $${PWD}/sysadm-beadm.h \ + $${PWD}/sysadm-filesystem.h \ $${PWD}/sysadm-iocage.h \ $${PWD}/sysadm-iohyve.h \ $${PWD}/sysadm-lifepreserver.h \ @@ -19,6 +20,7 @@ HEADERS += $${PWD}/sysadm-global.h \ SOURCES += $${PWD}/NetDevice.cpp \ $${PWD}/sysadm-general.cpp \ $${PWD}/sysadm-beadm.cpp \ + $${PWD}/sysadm-filesystem.cpp \ $${PWD}/sysadm-iocage.cpp \ $${PWD}/sysadm-iohyve.cpp \ $${PWD}/sysadm-lifepreserver.cpp \ diff --git a/src/server/library/sysadm-filesystem.cpp b/src/server/library/sysadm-filesystem.cpp new file mode 100644 index 0000000..65ca369 --- /dev/null +++ b/src/server/library/sysadm-filesystem.cpp @@ -0,0 +1,57 @@ +//=========================================== +// 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-filesystem.h" +#include "sysadm-general.h" + +using namespace sysadm; + +QJsonObject FS::list_dir(QJsonObject jsin) { + QJsonObject retObject; + QString fsdir; + + QStringList keys = jsin.keys(); + if(! keys.contains("dir")){ + retObject.insert("error", "Requires dir key"); + return retObject; + } + + fsdir = jsin.value("dir").toString(); + + if ( fsdir.isEmpty() ) { + retObject.insert("error", "Empty dir name"); + return retObject; + } + + // TODO + // + // Add some sort of check here to ensure the connected user has + // perms to read / list this directory + + QString tmp; + QDir dir(fsdir); + QFileInfoList list = dir.entryInfoList(); + for (long i = 0; i < list.size(); ++i) { + QFileInfo fileInfo = list.at(i); + tmp = fileInfo.fileName(); + if ( tmp == "." || tmp == ".." ) + continue; + + QJsonObject dsetvals; + if ( fileInfo.isDir() ) { + dsetvals.insert("dir", true ); + } else if (fileInfo.isSymLink() ) { + dsetvals.insert("symlink", true ); + dsetvals.insert("target", fileInfo.symLinkTarget() ); + } else { + dsetvals.insert("size", fileInfo.size() ); + dsetvals.insert("owner", fileInfo.owner() ); + dsetvals.insert("group", fileInfo.group() ); + } + retObject.insert(tmp, dsetvals); + } + return retObject; +} diff --git a/src/server/library/sysadm-filesystem.h b/src/server/library/sysadm-filesystem.h new file mode 100644 index 0000000..3849e3a --- /dev/null +++ b/src/server/library/sysadm-filesystem.h @@ -0,0 +1,23 @@ +//=========================================== +// 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_FILESYSTEM_H +#define __PCBSD_LIB_UTILS_FILESYSTEM_H + +#include "sysadm-global.h" + +namespace sysadm{ + +class FS{ + +public: + static QJsonObject list_dir(QJsonObject jsin); + +}; + +}//end of sysadm namespace + +#endif From 0cd90b35589a297ff2630441d6a914cd77021fee Mon Sep 17 00:00:00 2001 From: dlavigne Date: Fri, 22 Apr 2016 12:29:56 -0400 Subject: [PATCH 4/4] Doc new fs class. --- api/classes/fs.rst | 95 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 api/classes/fs.rst diff --git a/api/classes/fs.rst b/api/classes/fs.rst new file mode 100644 index 0000000..d5d4fc0 --- /dev/null +++ b/api/classes/fs.rst @@ -0,0 +1,95 @@ +.. _fs: + +fs +** + +The fs class is used to to manage the files and directories on the system. + +Every fs class request contains the following parameters: + ++---------------------------------+---------------+----------------------------------------------------------------------------------------------------------------------+ +| **Parameter** | **Value** | **Description** | +| | | | ++=================================+===============+======================================================================================================================+ +| id | | any unique value for the request; examples include a hash, checksum, or uuid | +| | | | ++---------------------------------+---------------+----------------------------------------------------------------------------------------------------------------------+ +| name | fs | | +| | | | ++---------------------------------+---------------+----------------------------------------------------------------------------------------------------------------------+ +| namespace | sysadm | | +| | | | ++---------------------------------+---------------+----------------------------------------------------------------------------------------------------------------------+ +| action | | supported actions include "dirlist" | +| | | | ++---------------------------------+---------------+----------------------------------------------------------------------------------------------------------------------+ + +The rest of this section provides examples of the available *actions* for each type of request, along with their responses. + +.. index:: dirlist, fs + +.. _List Directory: + +List Directory +============== + +The "dirlist" action lists the contents of the specified directory. + +**REST Request** + +.. code-block:: json + + PUT /sysadm/fs + { + "dir" : "/root", + "action" : "dirlist" + } + +**WebSocket Request** + +.. code-block:: json + + { + "args" : { + "dir" : "/root", + "action" : "dirlist" + }, + "id" : "fooid", + "name" : "fs", + "namespace" : "sysadm" + } + +**Response** + +.. code-block:: json + + { + "args": { + "dirlist": { + "VirtualBox VMs": { + "dir": true + }, + "freenas-auto.iso": { + "group": "wheel", + "owner": "root", + "size": 408049664 + }, + "ixbuild": { + "dir": true + }, + "pc-sysinstall.cfg": { + "group": "wheel", + "owner": "root", + "size": 1741 + }, + "pc-sysinstall.log": { + "group": "wheel", + "owner": "root", + "size": 125408 + } + } + }, + "id": "fooid", + "name": "response", + "namespace": "sysadm" + } \ No newline at end of file