diff --git a/src/library/sysadm-lifepreserver.cpp b/src/library/sysadm-lifepreserver.cpp index a9bc8f5..47db667 100644 --- a/src/library/sysadm-lifepreserver.cpp +++ b/src/library/sysadm-lifepreserver.cpp @@ -186,6 +186,54 @@ QJsonObject LifePreserver::listCron() { return retObject; } +// Return a list of replication targets +QJsonObject LifePreserver::listReplication() { + QJsonObject retObject; + + QStringList output = General::RunCommand("lpreserver replicate list").split("\n"); + QStringList setitems; + QString tmpkey; + QRegExp sep("\\s+"); + + // Parse the output + bool inSection = false; + for ( int i = 0; i < output.size(); i++) + { + if ( output.at(i).indexOf("-----------------") != -1 ) { + inSection = true; + continue; + } + + if (!inSection) + continue; + + if ( output.at(i).isEmpty() || output.at(i).indexOf("-----------------") != -1 ) + break; + + // Breakdown the settings + QJsonObject values; + tmpkey = ""; + QString dset, rdset, user, host, port, parseline, time; + dset = output.at(i).section(sep, 0, 0).simplified(); + parseline = output.at(i).section(sep, 2, 2).simplified(); + user = parseline.section("@", 0, 0); + host = parseline.section("@", 1, 1).section("[", 0, 0); + port = parseline.section("@", 1, 1).section("[", 1, 1).section("]", 0, 0); + rdset = parseline.section(":", 1, 1); + time = output.at(i).section(sep, 4, 4).simplified(); + + values.insert("dataset", dset); + values.insert("user", user); + values.insert("port", port); + values.insert("host", host); + values.insert("rdset", rdset); + values.insert("frequency", time); + retObject.insert(dset + "->" + host, values); + } + + return retObject; +} + // Return a list of snapshots on a particular pool / dataset QJsonObject LifePreserver::listSnap(QJsonObject jsin) { QJsonObject retObject; diff --git a/src/library/sysadm-lifepreserver.h b/src/library/sysadm-lifepreserver.h index 66708b8..c404feb 100644 --- a/src/library/sysadm-lifepreserver.h +++ b/src/library/sysadm-lifepreserver.h @@ -17,6 +17,7 @@ public: static QJsonObject addReplication(QJsonObject jsin); static QJsonObject initReplication(QJsonObject jsin); static QJsonObject listCron(); + static QJsonObject listReplication(); static QJsonObject listSnap(QJsonObject jsin); static QJsonObject removeSnapshot(QJsonObject jsin); static QJsonObject revertSnapshot(QJsonObject jsin); diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index 9ffc94a..1b50261 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -197,6 +197,10 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmLifePreserverRequest(const Q ok = true; out->insert("listcron", sysadm::LifePreserver::listCron()); } + if(act=="listreplication"){ + ok = true; + out->insert("listreplication", sysadm::LifePreserver::listReplication()); + } if(act=="listsnap"){ ok = true; out->insert("listsnap", sysadm::LifePreserver::listSnap(in_args.toObject())); diff --git a/tests/api-test.sh b/tests/api-test.sh index 2f53bb9..2321f04 100755 --- a/tests/api-test.sh +++ b/tests/api-test.sh @@ -70,17 +70,21 @@ echo "" # Source our resty functions . ./utils/resty -W "https://127.0.0.1:12151" -H "Accept: application/json" -H "Content-Type: application/json" -u ${fuser}:${fpass} -# Check the reply of this REST query -echo "" -echo "REST Request:" -echo "-------------------------------" -echo "PUT /${namesp}/${name}" -echo "${payload}" | perl -0007 -MJSON -ne'print to_json(from_json($_, {allow_nonref=>1}),{pretty=>1})."\n"' +# Save output to a file in addition to stdout +ofile="/tmp/api-response" +echo "" > /tmp/api-response -echo "" -echo "REST Response:" -echo "-------------------------------" -PUT /${namesp}/${name} "${payload}" -v -k 2>/tmp/.rstErr +# Check the reply of this REST query +echo "" | tee -a $ofile +echo "REST Request:" | tee -a $ofile +echo "-------------------------------" | tee -a $ofile +echo "PUT /${namesp}/${name}" | tee -a $ofile +echo "${payload}" | perl -0007 -MJSON -ne'print to_json(from_json($_, {allow_nonref=>1}),{pretty=>1})."\n"' | tee -a $ofile + +echo "" | tee -a $ofile +echo "REST Response:" | tee -a $ofile +echo "-------------------------------" | tee -a $ofile +PUT /${namesp}/${name} "${payload}" -v -k 2>/tmp/.rstErr | tee -a $ofile if [ $? -ne 0 ] ; then echo "Failed.. Error output:" cat /tmp/.rstErr @@ -90,12 +94,12 @@ fi # Now check the response via WebSockets export NODE_TLS_REJECT_UNAUTHORIZED=0 -echo "" -echo "WebSocket Request:" -echo "-------------------------------" -echo "{ \"namespace\":\"${namesp}\", \"name\":\"${name}\", \"id\":\"fooid\", \"args\":${payload} }" | perl -0007 -MJSON -ne'print to_json(from_json($_, {allow_nonref=>1}),{pretty=>1})."\n"' +echo "" | tee -a $ofile +echo "WebSocket Request:" | tee -a $ofile +echo "-------------------------------" | tee -a $ofile +echo "{ \"namespace\":\"${namesp}\", \"name\":\"${name}\", \"id\":\"fooid\", \"args\":${payload} }" | perl -0007 -MJSON -ne'print to_json(from_json($_, {allow_nonref=>1}),{pretty=>1})."\n"' | tee -a $ofile -echo "" -echo "WebSocket Response:" -echo "-------------------------------" -echo "{ \"namespace\":\"${namesp}\", \"name\":\"${name}\", \"id\":\"fooid\", \"args\":${payload} }" | node sendwebsocket.js "$fuser" "$fpass" +echo "" | tee -a $ofile +echo "WebSocket Response:" | tee -a $ofile +echo "-------------------------------" | tee -a $ofile +echo "{ \"namespace\":\"${namesp}\", \"name\":\"${name}\", \"id\":\"fooid\", \"args\":${payload} }" | node sendwebsocket.js "$fuser" "$fpass" | tee -a $ofile