From b074a611eed26f002211abfc505af066432b3236 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Tue, 22 Mar 2016 09:39:39 -0400 Subject: [PATCH] Move the "zpool list" parsing function over to a new library class (sysadm::ZFS). This adjusts the sysadm/zfs "list_pools" action return message a bit - it just moves the list of pools one level down - within a "list_pools" object. --- src/server/EventWatcher.cpp | 58 +++++++++---------------------- src/server/WebBackend.cpp | 25 ++----------- src/server/library/library.pri | 6 ++-- src/server/library/sysadm-zfs.cpp | 47 +++++++++++++++++++++++++ src/server/library/sysadm-zfs.h | 23 ++++++++++++ 5 files changed, 94 insertions(+), 65 deletions(-) create mode 100644 src/server/library/sysadm-zfs.cpp create mode 100644 src/server/library/sysadm-zfs.h diff --git a/src/server/EventWatcher.cpp b/src/server/EventWatcher.cpp index fb5744c..07d8bca 100644 --- a/src/server/EventWatcher.cpp +++ b/src/server/EventWatcher.cpp @@ -7,6 +7,7 @@ #include "globals.h" #include "library/sysadm-general.h" +#include "library/sysadm-zfs.h" // === PUBLIC === EventWatcher::EventWatcher(){ @@ -340,49 +341,24 @@ void EventWatcher::CheckSystemState(){ obj.insert("hostname",oldhostname); //Next Check zpools - QStringList info = sysadm::General::RunCommand(ok, "zpool list").split("\n"); - if(ok && info.length()>1){ //first line is headers - QJsonObject zpools; - //Line Format (3/2/16): Name/Size/Alloc/Free/Expandsz/Frag/Cap/Dedup/Health/Altroot - for(int i=1; i 90 ) { - if ( priority < 9 ) - priority = 6; - } + if ( zpools.value(pools[i]).toObject().value("health").toString() != "ONLINE" ){ + if(priority < 9){ priority = 9; } } - //Insert the stats for this pool into the object - QJsonObject zstats; - zstats.insert("size", total); - zstats.insert("used", used); - zstats.insert("free", free); - zstats.insert("frag", frag); - zstats.insert("capacity", cap); - zstats.insert("health", health); - zpools.insert(pool, zstats); - } //end loop over zpool list lines - obj.insert("zpools", zpools ); - }//end check for valid zpool output + // Check the capacity, if over 90% we should warn + bool ok = false; + int cap = zpools.value(pools[i]).toObject().value("capacity").toInt(ok); + if(ok && cap>90) { + if(priority < 6){ priority = 6; } + } + } //end loop over pools + obj.insert("zpools", zpools ); + } // Priority 0-10 obj.insert("priority", DisplayPriority(priority) ); diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index 11c751c..ed313bd 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -17,9 +17,9 @@ #include "library/sysadm-network.h" #include "library/sysadm-systemmanager.h" #include "library/sysadm-update.h" +#include "library/sysadm-zfs.h" #include "syscache-client.h" -//#include "dispatcher-client.h" #define DEBUG 0 #define SCLISTDELIM QString("::::") //SysCache List Delimiter @@ -672,27 +672,8 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmZfsRequest(const QJsonValue if(!in_args.isObject() || !in_args.toObject().contains("action") ){ return RestOutputStruct::BADREQUEST; } QString act = in_args.toObject().value("action").toString(); if(act=="list_pools"){ - bool ok = false; - QStringList info = sysadm::General::RunCommand(ok, "zpool list").split("\n"); - if(ok && info.length()>1){ //first line is headers - //Line Format (3/2/16): Name/Size/Alloc/Free/Expandsz/Frag/Cap/Dedup/Health/Altroot - for(int i=1; iinsert(name,obj); - } - } + QJsonObject pools = sysadm::ZFS::zpool_list(); + if(!pools.isEmpty()){ out->insert("list_pools",pools); } }else{ //unknown action return RestOutputStruct::BADREQUEST; diff --git a/src/server/library/library.pri b/src/server/library/library.pri index 53cb45e..97e1da8 100644 --- a/src/server/library/library.pri +++ b/src/server/library/library.pri @@ -12,7 +12,8 @@ HEADERS += $${PWD}/sysadm-global.h \ $${PWD}/sysadm-servicemanager.h\ $${PWD}/sysadm-systemmanager.h\ $${PWD}/sysadm-update.h \ - $${PWD}/sysadm-usermanager.h + $${PWD}/sysadm-usermanager.h \ + $${PWD}/sysadm-zfs.h SOURCES += $${PWD}/NetDevice.cpp \ $${PWD}/sysadm-general.cpp \ @@ -25,5 +26,6 @@ SOURCES += $${PWD}/NetDevice.cpp \ $${PWD}/sysadm-servicemanager.cpp \ $${PWD}/sysadm-systemmanager.cpp \ $${PWD}/sysadm-update.cpp \ - $${PWD}/sysadm-usermanager.cpp + $${PWD}/sysadm-usermanager.cpp \ + $${PWD}/sysadm-zfs.cpp diff --git a/src/server/library/sysadm-zfs.cpp b/src/server/library/sysadm-zfs.cpp new file mode 100644 index 0000000..3ab95af --- /dev/null +++ b/src/server/library/sysadm-zfs.cpp @@ -0,0 +1,47 @@ +//=========================================== +// 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-zfs.h" +#include "sysadm-general.h" + +using namespace sysadm; + +QJsonObject ZFS::zpool_list(){ + QJsonObject zpools; + bool ok = false; + QStringList info = sysadm::General::RunCommand(ok, "zpool list").split("\n"); + if(!ok || info.length()<2){ return zpools; } //nothing to return + + //Line Format (3/2/16): Name/Size/Alloc/Free/Expandsz/Frag/Cap/Dedup/Health/Altroot + for(int i=1; i