diff options
-rw-r--r-- | fg21sim/webui/handlers/products.py | 17 | ||||
-rw-r--r-- | fg21sim/webui/static/js/products.js | 21 |
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) |