From f4a61e7d0a06f739e6645ec78d7ffa3ee43071df Mon Sep 17 00:00:00 2001 From: Kris Moore Date: Wed, 3 Feb 2016 13:21:00 -0500 Subject: [PATCH] Add new API call to set a sysctl REST Request: ------------------------------- PUT /sysadm/systemmanager { "value" : "0", "sysctl" : "security.jail.mount_devfs_allowed", "action" : "setsysctl" } REST Response: ------------------------------- { "args": { "setsysctl": { "response": "security.jail.mount_devfs_allowed: 1 -> 0", "sysctl": "security.jail.mount_devfs_allowed", "value": "0" } } } WebSocket Request: ------------------------------- { "args" : { "value" : "0", "action" : "setsysctl", "sysctl" : "security.jail.mount_devfs_allowed" }, "name" : "systemmanager", "namespace" : "sysadm", "id" : "fooid" } WebSocket Response: ------------------------------- { "args": { "setsysctl": { "response": "security.jail.mount_devfs_allowed: 1 -> 0", "sysctl": "security.jail.mount_devfs_allowed", "value": "0" } }, "id": "fooid", "name": "response", "namespace": "sysadm" } --- src/server/WebBackend.cpp | 4 ++++ src/server/library/sysadm-systemmanager.cpp | 21 +++++++++++++++++++++ src/server/library/sysadm-systemmanager.h | 1 + 3 files changed, 26 insertions(+) diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index ac384d7..9fa478e 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -329,6 +329,10 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmSystemMgmtRequest(const QJso ok = true; out->insert("procinfo", sysadm::SysMgmt::procInfo()); } + if(act=="setsysctl"){ + ok = true; + out->insert("setsysctl", sysadm::SysMgmt::setSysctl(in_args.toObject())); + } if(act=="sysctllist"){ ok = true; out->insert("sysctllist", sysadm::SysMgmt::sysctlList()); diff --git a/src/server/library/sysadm-systemmanager.cpp b/src/server/library/sysadm-systemmanager.cpp index 1a4ed93..444e727 100644 --- a/src/server/library/sysadm-systemmanager.cpp +++ b/src/server/library/sysadm-systemmanager.cpp @@ -291,6 +291,27 @@ QJsonObject SysMgmt::procInfo() { return retObject; } +// Set a sysctl +QJsonObject SysMgmt::setSysctl(QJsonObject jsin) { + QJsonObject retObject; + + QStringList keys = jsin.keys(); + if (! keys.contains("sysctl") || ! keys.contains("value") ) { + retObject.insert("error", "Missing required keys 'sysctl / value'"); + return retObject; + } + QString sysctl, value; + sysctl = jsin.value("sysctl").toString(); + value = jsin.value("value").toString(); + QString output = General::RunCommand("sysctl " + sysctl + "=" + value); + + retObject.insert("sysctl", sysctl); + retObject.insert("value", value); + retObject.insert("response", output.simplified()); + + return retObject; +} + // Return list of sysctls and their values QJsonObject SysMgmt::sysctlList() { QJsonObject retObject; diff --git a/src/server/library/sysadm-systemmanager.h b/src/server/library/sysadm-systemmanager.h index 13948a2..d73b845 100644 --- a/src/server/library/sysadm-systemmanager.h +++ b/src/server/library/sysadm-systemmanager.h @@ -21,6 +21,7 @@ public: static QJsonObject killProc(QJsonObject); static QJsonObject memoryStats(); static QJsonObject procInfo(); + static QJsonObject setSysctl(QJsonObject); static QJsonObject sysctlList(); static QJsonObject systemInfo(); };