diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index dbae3e9..a07dc0c 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -682,16 +682,27 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmIohyveRequest(const QJsonVal // ==== SYSADM ZFS API ==== RestOutputStruct::ExitCode WebSocket::EvaluateSysadmZfsRequest(const QJsonValue in_args, QJsonObject *out){ - if(!in_args.isObject() || !in_args.toObject().contains("action") ){ return RestOutputStruct::BADREQUEST; } - QString act = in_args.toObject().value("action").toString(); - if(act=="list_pools"){ - QJsonObject pools = sysadm::ZFS::zpool_list(); - if(!pools.isEmpty()){ out->insert("list_pools",pools); } - }else{ - //unknown action + if( ! in_args.isObject()){ + return RestOutputStruct::BADREQUEST; + } + QStringList keys = in_args.toObject().keys(); + bool ok = false; + if(keys.contains("action")) { + QString act = JsonValueToString(in_args.toObject().value("action")); + if(act=="list_pools"){ + QJsonObject pools = sysadm::ZFS::zpool_list(); + if(!pools.isEmpty()){ out->insert("list_pools",pools); } + } + else if(act=="datasets"){ + ok = true; + out->insert("datasets", sysadm::ZFS::zfs_list(in_args.toObject())); + } + } //end of "action" key usage + + //If nothing done - return the proper code + if(!ok){ return RestOutputStruct::BADREQUEST; } - return RestOutputStruct::OK; } diff --git a/src/server/library/sysadm-zfs.cpp b/src/server/library/sysadm-zfs.cpp index 5209040..72154e2 100644 --- a/src/server/library/sysadm-zfs.cpp +++ b/src/server/library/sysadm-zfs.cpp @@ -9,6 +9,50 @@ using namespace sysadm; +QJsonObject ZFS::zfs_list(QJsonObject jsin) { + QJsonObject retObject; + QString zpool; + + QStringList keys = jsin.keys(); + if(! keys.contains("zpool")){ + retObject.insert("error", "Requires zpool keys"); + return retObject; + } + + zpool = jsin.value("zpool").toString(); + + if ( zpool.isEmpty() ) { + retObject.insert("error", "Empty zpool name"); + return retObject; + } + + QString tmp; + QStringList output; + output = General::RunCommand("zfs", QStringList() << "list" << "-H" << "-r" << zpool).split("\n"); + + // Now parse the output + for ( int i = 0; i < output.size(); i++) + { + if ( output.at(i).indexOf("cannot open") != -1 ) { + retObject.insert("error", output.at(i)); + return retObject; + } + + // Now assemble your JSON + QJsonObject dsetvals; + tmp = output.at(i).simplified().section(" ", 0, 0).simplified(); + if ( tmp.isEmpty() ) + continue; + dsetvals.insert("used", output.at(i).simplified().section(" ", 1, 1) ); + dsetvals.insert("avail", output.at(i).simplified().section(" ", 2, 2) ); + dsetvals.insert("refer", output.at(i).simplified().section(" ", 3, 3) ); + dsetvals.insert("mountpoint", output.at(i).simplified().section(" ", 4, 4) ); + retObject.insert(tmp, dsetvals); + } + + return retObject; +} + QJsonObject ZFS::zpool_list(){ QJsonObject zpools; bool ok = false; @@ -44,4 +88,4 @@ QJsonObject ZFS::zpool_list(){ zpools.insert(pool, zstats); } //end loop over zpool list lines return zpools; -} \ No newline at end of file +} diff --git a/src/server/library/sysadm-zfs.h b/src/server/library/sysadm-zfs.h index 4047fd0..cd54f33 100644 --- a/src/server/library/sysadm-zfs.h +++ b/src/server/library/sysadm-zfs.h @@ -14,10 +14,11 @@ namespace sysadm{ class ZFS{ public: + static QJsonObject zfs_list(QJsonObject jsin); static QJsonObject zpool_list(); }; }//end of sysadm namespace -#endif \ No newline at end of file +#endif