From c506bcccb5076404b7b91655c050e686d03510a2 Mon Sep 17 00:00:00 2001 From: Kris Moore Date: Tue, 12 Jan 2016 13:36:42 -0500 Subject: [PATCH] Add new API call for reverting a dataset back to a specific snapshot REST Request: ------------------------------- PUT /sysadm/lifepreserver { "snap" : "auto-2016-01-09-18-00-00", "dataset" : "tank1/usr/jails", "action" : "revertsnap" } REST Response: ------------------------------- { "args": { "revertsnap": { "dataset": "tank1/usr/jails", "snap": "auto-2016-01-09-18-00-00" } } } WebSocket Request: ------------------------------- { "args" : { "dataset" : "tank1/usr/jails", "action" : "revertsnap", "snap" : "auto-2016-01-09-18-00-00" }, "namespace" : "sysadm", "name" : "lifepreserver", "id" : "fooid" } WebSocket Response: ------------------------------- { "args": { "revertsnap": { "dataset": "tank1/usr/jails", "snap": "auto-2016-01-09-18-00-00" } }, "id": "fooid", "name": "response", "namespace": "sysadm" } --- src/library/sysadm-lifepreserver.cpp | 43 ++++++++++++++++++++++++++++ src/library/sysadm-lifepreserver.h | 1 + src/server/WebBackend.cpp | 16 +++++++---- 3 files changed, 54 insertions(+), 6 deletions(-) diff --git a/src/library/sysadm-lifepreserver.cpp b/src/library/sysadm-lifepreserver.cpp index 21e1efa..9d2fa82 100644 --- a/src/library/sysadm-lifepreserver.cpp +++ b/src/library/sysadm-lifepreserver.cpp @@ -131,6 +131,49 @@ QJsonObject LifePreserver::listSnap(QJsonObject jsin) { return retObject; } +// Revert to a snapshot +QJsonObject LifePreserver::revertSnapshot(QJsonObject jsin) { + QJsonObject retObject; + QString dataset, snap; + + QStringList keys = jsin.keys(); + bool ok = false; + if(! keys.contains("dataset") || ! keys.contains("snap")){ + retObject.insert("error", "Requires dataset and snap keys"); + return retObject; + } + + // Get the dataset / snap + dataset = jsin.value("dataset").toString(); + snap = jsin.value("snap").toString(); + + // Make sure we have the dataset / snap key(s) + if ( dataset.isEmpty() || snap.isEmpty() ) { + retObject.insert("error", "Empty dataset or snap keys "); + return retObject; + } + + QStringList output; + output = General::RunCommand("lpreserver revertsnap " + dataset + " " + snap).split("\n"); + + // Check for any errors + for ( int i = 0; i < output.size(); i++) + { + if ( output.at(i).indexOf("ERROR:") != -1 ) { + retObject.insert("error", output.at(i)); + return retObject; + } + } + + // Got to the end, return the good json + QJsonObject values; + values.insert("dataset", dataset); + values.insert("snap", snap); + + return values; +} + + // Schedule a new scrub routine QJsonObject LifePreserver::scheduleScrub(QJsonObject jsin) { QJsonObject retObject; diff --git a/src/library/sysadm-lifepreserver.h b/src/library/sysadm-lifepreserver.h index 9f6ffa1..d57445e 100644 --- a/src/library/sysadm-lifepreserver.h +++ b/src/library/sysadm-lifepreserver.h @@ -17,6 +17,7 @@ public: // List schedule snapshots static QJsonObject listCron(); static QJsonObject listSnap(QJsonObject jsin); + static QJsonObject revertSnapshot(QJsonObject jsin); static QJsonObject scheduleSnapshot(QJsonObject jsin); static QJsonObject scheduleScrub(QJsonObject jsin); static QJsonObject settings(); diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index 970007e..bd52b14 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -141,6 +141,14 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmLifePreserverRequest(const Q bool ok = false; if(keys.contains("action")){ QString act = JsonValueToString(in_args.toObject().value("action")); + if(act=="cronscrub"){ + ok = true; + out->insert("cronscrub", sysadm::LifePreserver::scheduleScrub(in_args.toObject())); + } + if(act=="cronsnap"){ + ok = true; + out->insert("cronsnap", sysadm::LifePreserver::scheduleSnapshot(in_args.toObject())); + } if(act=="listcron"){ ok = true; out->insert("listcron", sysadm::LifePreserver::listCron()); @@ -149,13 +157,9 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmLifePreserverRequest(const Q ok = true; out->insert("listsnap", sysadm::LifePreserver::listSnap(in_args.toObject())); } - if(act=="cronscrub"){ + if(act=="revertsnap"){ ok = true; - out->insert("cronscrub", sysadm::LifePreserver::scheduleScrub(in_args.toObject())); - } - if(act=="cronsnap"){ - ok = true; - out->insert("cronsnap", sysadm::LifePreserver::scheduleSnapshot(in_args.toObject())); + out->insert("revertsnap", sysadm::LifePreserver::revertSnapshot(in_args.toObject())); } if(act=="settings"){ ok = true;