Add API call to kill processes on the system

pid = <pid>
signal = {INT|QUIT|ABRT|KILL|ALRM|TERM}

REST Request:
-------------------------------
PUT /sysadm/systemmanager
{
   "signal" : "KILL",
   "pid" : "13939",
   "action" : "killproc"
}

REST Response:
-------------------------------
{
    "args": {
        "killproc": {
            "action": "killproc",
            "pid": "13939",
            "signal": "KILL"
        }
    }
}

WebSocket Request:
-------------------------------
{
   "namespace" : "sysadm",
   "args" : {
      "pid" : "13939",
      "action" : "killproc",
      "signal" : "KILL"
   },
   "id" : "fooid",
   "name" : "systemmanager"
}

WebSocket Response:
-------------------------------
{
  "args": {
    "killproc": {
      "action": "killproc",
      "pid": "13939",
      "signal": "KILL"
    }
  },
  "id": "fooid",
  "name": "response",
  "namespace": "sysadm"
}
This commit is contained in:
Kris Moore
2016-02-03 12:45:02 -05:00
parent 6fd9a689b4
commit 36d2f77d5c
3 changed files with 50 additions and 2 deletions

View File

@@ -100,7 +100,7 @@ RestOutputStruct::ExitCode WebSocket::EvaluateBackendRequest(const RestInputStru
return EvaluateSysadmNetworkRequest(IN.args, out);
}else if(namesp=="rpc" && name=="syscache"){
return EvaluateSyscacheRequest(IN.args, out);
}else if(namesp=="sysadm" && name=="systeminfo"){
}else if(namesp=="sysadm" && name=="systemmanager"){
return EvaluateSysadmSystemMgmtRequest(IN.args, out);
}else if(namesp=="sysadm" && name=="update"){
return EvaluateSysadmUpdateRequest(IN.args, out);
@@ -317,6 +317,10 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmSystemMgmtRequest(const QJso
ok = true;
out->insert("externalmounts", sysadm::SysMgmt::externalDevicePaths());
}
if(act=="killproc"){
ok = true;
out->insert("killproc", sysadm::SysMgmt::killProc(in_args.toObject()));
}
if(act=="memorystats"){
ok = true;
out->insert("memorystats", sysadm::SysMgmt::memoryStats());

View File

@@ -161,6 +161,49 @@ QJsonObject SysMgmt::externalDevicePaths() {
return retObject;
}
// Kill a process
QJsonObject SysMgmt::killProc(QJsonObject jsin) {
QJsonObject retObject;
QStringList keys = jsin.keys();
if (! keys.contains("pid") ) {
retObject.insert("error", "Missing required key 'pid'");
return retObject;
}
// Save the target
QString pid, sig, tmp;
pid = jsin.value("pid").toString();
if ( keys.contains("signal") ) {
tmp = jsin.value("signal").toString();
if ( tmp == "HUP" ) {
sig = "-1";
} else if ( tmp == "INT" ) {
sig = "-2";
} else if ( tmp == "QUIT" ) {
sig = "-3";
} else if ( tmp == "ABRT" ) {
sig = "-6";
} else if ( tmp == "KILL" ) {
sig = "-9";
} else if ( tmp == "ALRM" ) {
sig = "-14";
} else if ( tmp == "TERM" ) {
sig = "-15";
} else {
retObject.insert("error", "Invalid signal! (INT|QUIT|ABRT|KILL|ALRM|TERM)");
return retObject;
}
} else {
sig = "-9";
}
// This could be switched to kill(2) at some point
General::RunCommand("kill " + sig + " " + pid);
return jsin;
}
// Return information about memory
QJsonObject SysMgmt::memoryStats() {
QJsonObject retObject;

View File

@@ -18,9 +18,10 @@ public:
static QJsonObject cpuPercentage();
static QJsonObject cpuTemps();
static QJsonObject externalDevicePaths();
static QJsonObject killProc(QJsonObject);
static QJsonObject memoryStats();
static QJsonObject systemInfo();
static QJsonObject procInfo();
static QJsonObject systemInfo();
};
} //end of pcbsd namespace