diff --git a/src/library/sysadm-lifepreserver.cpp b/src/library/sysadm-lifepreserver.cpp index 0e95bee..ab4c73a 100644 --- a/src/library/sysadm-lifepreserver.cpp +++ b/src/library/sysadm-lifepreserver.cpp @@ -14,6 +14,75 @@ using namespace sysadm; //PLEASE: Keep the functions in the same order as listed in pcbsd-general.h +// Add a new replication target +QJsonObject LifePreserver::addReplication(QJsonObject jsin) { + QJsonObject retObject; + QString host, user, port, password, ldataset, rdataset, frequency; + + QStringList keys = jsin.keys(); + if (! keys.contains("host") + || ! keys.contains("user") + || ! keys.contains("port") + || ! keys.contains("password") + || ! keys.contains("dataset") + || ! keys.contains("remotedataset") + || ! keys.contains("frequency") ) { + retObject.insert("error", "Missing required keys"); + return retObject; + } + + // Get the key values + host = jsin.value("host").toString(); + user = jsin.value("user").toString(); + port = jsin.value("port").toString(); + password = jsin.value("password").toString(); + ldataset = jsin.value("dataset").toString(); + rdataset = jsin.value("remotedataset").toString(); + frequency = jsin.value("frequency").toString(); + + // Make sure we have the dataset / snap key(s) + if ( host.isEmpty() + || user.isEmpty() + || port.isEmpty() + || password.isEmpty() + || ldataset.isEmpty() + || rdataset.isEmpty() + || frequency.isEmpty() ) { + retObject.insert("error", "Empty dataset or snap keys "); + return retObject; + } + + // Run the command with the SSHPASS env variable set + QStringList output; + output = General::RunCommand("lpreserver", QStringList() << "replicate" << "add" + << host + << user + << port + << ldataset + << rdataset + << frequency, "", QStringList() << "SSHPASS=" + password ).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("host", host); + values.insert("user", user); + values.insert("port", port); + values.insert("ldataset", ldataset); + values.insert("rdataset", rdataset); + values.insert("frequency", frequency); + + return values; +} + // Build list of scheduled cron snapshot jobs QJsonObject LifePreserver::listCron() { QJsonObject retObject; diff --git a/src/library/sysadm-lifepreserver.h b/src/library/sysadm-lifepreserver.h index d509132..3954d4f 100644 --- a/src/library/sysadm-lifepreserver.h +++ b/src/library/sysadm-lifepreserver.h @@ -14,7 +14,7 @@ namespace sysadm{ class LifePreserver{ public: - // List schedule snapshots + static QJsonObject addReplication(QJsonObject jsin); static QJsonObject listCron(); static QJsonObject listSnap(QJsonObject jsin); static QJsonObject removeSnapshot(QJsonObject jsin); diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index 1c42040..8394e4d 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -141,6 +141,10 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmLifePreserverRequest(const Q bool ok = false; if(keys.contains("action")){ QString act = JsonValueToString(in_args.toObject().value("action")); + if(act=="addreplication"){ + ok = true; + out->insert("addreplication", sysadm::LifePreserver::addReplication(in_args.toObject())); + } if(act=="cronscrub"){ ok = true; out->insert("cronscrub", sysadm::LifePreserver::scheduleScrub(in_args.toObject()));