aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fg21sim/webui/handlers/products.py17
-rw-r--r--fg21sim/webui/static/js/products.js21
2 files changed, 37 insertions, 1 deletions
diff --git a/fg21sim/webui/handlers/products.py b/fg21sim/webui/handlers/products.py
index f68fa5d..ffb27bb 100644
--- a/fg21sim/webui/handlers/products.py
+++ b/fg21sim/webui/handlers/products.py
@@ -8,6 +8,7 @@ Handle the AJAX requests from the client to manage the simulation products.
import os
import logging
+import shutil
import tornado.ioloop
from tornado.escape import json_decode, json_encode
@@ -41,16 +42,32 @@ class ProductsAJAXHandler(BaseRequestHandler):
Supported actions:
- get: Get the current products manifest
+ - which: Locate the command/program (check whether the command/program
+ can be found in PATH and is executable)
- download: TODO
- open: TODO
"""
action = self.get_argument("action", "get")
if action == "get":
+ # Get current products manifest
response = {
"manifest": self.products.manifest,
"localhost": self.from_localhost,
}
success = True
+ elif action == "which":
+ # Locate (and check) the command/program
+ cmd = json_decode(self.get_argument("cmd"))
+ cmdpath = shutil.which(cmd)
+ if cmdpath:
+ success = True
+ response = {
+ "isExecutable": True,
+ "cmdPath": cmdpath,
+ }
+ else:
+ success = False
+ reason = "Cannot locate the executable for: {0}".format(cmd)
else:
# ERROR: bad action
success = False
diff --git a/fg21sim/webui/static/js/products.js b/fg21sim/webui/static/js/products.js
index 0b25eaa..72a7028 100644
--- a/fg21sim/webui/static/js/products.js
+++ b/fg21sim/webui/static/js/products.js
@@ -192,6 +192,25 @@ var getServerManifest = function (url) {
/**
+ * Locate the command in the `$PATH` on the server, which checks
+ * whether the command can be called.
+ *
+ * @param {String} cmd - The command name or path.
+ */
+var whichExecutable = function (url, cmd) {
+ return $.getJSON(url, {action: "which", cmd: JSON.stringify(cmd)})
+ .fail(function (jqxhr) {
+ var modalData = {};
+ modalData.icon = "times-circle";
+ modalData.contents = "Cannot locate the command in PATH!";
+ modalData.code = jqxhr.status;
+ modalData.reason = jqxhr.statusText;
+ showModalProducts(modalData);
+ });
+};
+
+
+/**
* Reset the products manifest on both the server side and client side
*/
var resetManifest = function (url) {
@@ -270,7 +289,7 @@ $(document).ready(function () {
// Save current products manifest
$("#save-products").on("click", function () {
- saveServerManifest(ajax_url);
+ saveServerManifest(ajax_url, true);
});
// Show product information (metadata)