r20220: Apply patch from Brad Henry with some additional qooxdoo/json-rpc SWAT
authorDerrell Lipman <derrell@samba.org>
Sat, 16 Dec 2006 19:07:37 +0000 (19:07 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:29:23 +0000 (14:29 -0500)
functionality: basic admin console.

services/samba/adm.esp [new file with mode: 0644]
swat/apps/plug-ins/echo.js [new file with mode: 0644]
swat/apps/plug-ins/nbt_stats.js [new file with mode: 0644]
swat/apps/samba/utils/admin_console.html [new file with mode: 0644]
swat/menu.js

diff --git a/services/samba/adm.esp b/services/samba/adm.esp
new file mode 100644 (file)
index 0000000..2fd0ec2
--- /dev/null
@@ -0,0 +1,22 @@
+<%
+
+jsonrpc_include("resources.esp");
+
+libinclude("base.js");
+libinclude("management.js");
+
+function _echo(params, error) {
+       var echo_string = params[0];
+       return echo_string;
+}
+jsonrpc.method.echo = _echo;
+
+function _nbt_packet_stats(params, error) {
+       var stats = nbtd_statistics();
+       stats.server_status = new Object();
+       stats.server_status = server_status("nbt");
+       return stats;
+}
+jsonrpc.method.NBTPacketStats = _nbt_packet_stats;
+
+%>
diff --git a/swat/apps/plug-ins/echo.js b/swat/apps/plug-ins/echo.js
new file mode 100644 (file)
index 0000000..1a32c5c
--- /dev/null
@@ -0,0 +1,71 @@
+
+// This function takes the main pane widget and jams its widget in the right
+// sub-pane.
+
+function _asyncEchoHandler(result, ex, id, paneWidget) {
+       var replyTextArea = null;
+       var refreshButton = null;
+       var echoTextField = null;
+
+       if (ex == null) {
+               // We need to remove anything previously drawn in this area.
+               paneWidget.removeAll();
+
+               echoTextField = new qx.ui.form.TextField();
+               echoTextField.setTop(0);
+               echoTextField.setLeft(0);
+
+               refreshButton = new qx.ui.form.Button("Refresh");
+               refreshButton.setTop(0);
+               refreshButton.setLeft(150);
+
+               replyTextArea = new
+                       qx.ui.form.TextArea(result);
+               replyTextArea.setWrap(true);
+               replyTextArea.setWidth("100%");
+               replyTextArea.setHeight("50%");
+               replyTextArea.setTop(30);
+               replyTextArea.setBottom(50);
+               replyTextArea.setLeft(0);
+               replyTextArea.setRight(20);
+       } else {
+               alert("Async(" + id + ") exception: " + ex);
+       }
+       paneWidget.add(replyTextArea);
+       paneWidget.add(refreshButton);
+       paneWidget.add(echoTextField);
+
+       // Provide a handler for the button.
+       with (refreshButton) {
+               addEventListener("execute", function(e) {
+                       this.debug("executed: " + this.getLabel());
+                       this.debug("echoTextField.getValue(): " + echoTextField.getValue());
+                       _echoPlugInDisplay(paneWidget, echoTextField.getValue());
+               });
+       };
+}
+
+function _echoPlugInDisplay(paneWidget, echoText) {
+       if (echoText == null) {
+               echoText = "Hello World!";
+       }
+
+        var rpc = new qx.io.remote.Rpc();
+        rpc.setTimeout(60000);
+        rpc.setUrl("/services/");
+        rpc.setServiceName("samba.adm");
+        rpc.setCrossDomain(false);
+
+        mycall = rpc.callAsync(
+                function(result, ex, id) {
+                       _asyncEchoHandler(result, ex, id, paneWidget);
+                },
+                "echo",
+               echoText);
+}
+
+function EchoPlugIn() {
+       var o = new Object();
+       o.display = _echoPlugInDisplay;
+       return o;
+}
diff --git a/swat/apps/plug-ins/nbt_stats.js b/swat/apps/plug-ins/nbt_stats.js
new file mode 100644 (file)
index 0000000..f9de190
--- /dev/null
@@ -0,0 +1,62 @@
+
+// This function takes the main pane widget and jams its widget in the right
+// sub-pane.
+
+function _asyncNBTStatsHandler(result, ex, id, paneWidget) {
+       var statusTextArea = null;
+
+       var listData = [];
+       listData.push({
+               server_status : { text : result.server_status },
+               total_received : { text : result.total_received.toString() },
+               total_sent : { text : result.total_sent.toString() },
+               query_count : { text : result.query_count.toString() },
+               release_count : { text : result.release_count.toString() },
+               register_count : { text : result.register_count.toString() }
+       });
+
+       if (ex == null) {
+               // We need to remove anything previously drawn in this area.
+               paneWidget.removeAll();
+
+               statusTextArea = new
+                       qx.ui.form.TextArea("Server Status: " +
+                               result.server_status.toString() + "\n" +
+                               "Total Received: " +
+                               result.total_received.toString() + "\n" +
+                               "Total Sent: " +
+                               result.total_sent.toString() + "\n" +
+                               "Query Count: " +
+                               result.query_count.toString() + "\n" +
+                               "Release Count: " +
+                               result.release_count.toString() + "\n" +
+                               "Register Count: " +
+                               result.register_count.toString() + "\n");
+               statusTextArea.setWrap(true);
+               statusTextArea.setWidth("100%");
+               statusTextArea.setHeight("100%");
+       } else {
+               alert("Async(" + id + ") exception: " + ex);
+       }
+       paneWidget.add(statusTextArea);
+}
+
+function _NBTStatsPlugInDisplay(paneWidget) {
+        var rpc = new qx.io.remote.Rpc();
+        rpc.setTimeout(60000);
+        rpc.setUrl("/services/");
+        rpc.setServiceName("samba.adm");
+        rpc.setCrossDomain(false);
+
+        mycall = rpc.callAsync(
+                function(result, ex, id) {
+                       _asyncNBTStatsHandler(result, ex, id, paneWidget);
+                },
+                "NBTPacketStats");
+}
+
+function NBTStatsPlugIn() {
+       var o = new Object();
+       o.display = _NBTStatsPlugInDisplay;
+       return o;
+}
diff --git a/swat/apps/samba/utils/admin_console.html b/swat/apps/samba/utils/admin_console.html
new file mode 100644 (file)
index 0000000..c314c8f
--- /dev/null
@@ -0,0 +1,258 @@
+<HTML>
+
+<HEAD>
+       <META http-equiv="Content-Type" content="text/html; charset=utf-8" />
+       <TITLE>Samba Admin Console</TITLE>
+
+       <LINK type="text/css" rel="stylesheet" href="../../resource/css/layout-samba.css"/>
+       <!--[if IE]>
+       <LINK
+               type="text/css" rel="stylesheet" href="../../resource/css/layout-samba.css"/>
+       <![endif]-->
+       <SCRIPT type="text/javascript" src="../../script/qx.js"></SCRIPT>
+
+       <!--> Include plug-in applications <!-->
+       <SCRIPT type="text/javascript" src="../../plug-ins/echo.js"></SCRIPT>
+       <SCRIPT type="text/javascript" src="../../plug-ins/nbt_stats.js"></SCRIPT>
+</HEAD>
+
+<BODY>
+       <SCRIPT type="text/javascript" src="../../script/layout-samba.js"></SCRIPT>
+       <DIV style="position: absolute; background-color: transparent; right:0; top:0; z-index: 1000000001;">
+               <IMG src="../../../images/logo.png">
+       </DIV>
+
+       <DIV id="demoHead">
+               Samba Administrative Console
+       </DIV>
+       <SCRIPT type="text/javascript">
+
+// All global variables will be members of this object.
+globals = new Object();
+
+//paneWidget is the split-pane.
+globals.paneWidget = qx.ui.splitpane.SplitPane;
+
+//appTree is paneWidget's left pane.
+globals.appTree = new Object();
+
+//appInstance is paneWidget's right pane.
+globals.appInstance = new qx.ui.layout.CanvasLayout();
+
+function createApplicationTree() {
+       var app_treeRowStructure =
+               qx.ui.treefullcontrol.TreeRowStructure.getInstance().standard(
+                       "Plug-in Apps",
+                       "icon/16/desktop.png",
+                       "icon/16/dictionary.png");
+       var app_tree = new
+               qx.ui.treefullcontrol.Tree(app_treeRowStructure);
+
+       with (app_tree) {
+               setBackgroundColor(255);
+               setBorder(qx.renderer.border.BorderPresets.getInstance().inset);
+               setOverflow("scrollY");
+               setWidth("100%");
+               setHeight("100%");
+       };
+
+       app_tree.getManager().addEventListener("changeSelection", function(e) {
+               sel = new Object();
+               sel = app_tree.getSelectedElement();
+               var appName = sel.getUserData("PlugIn Name");
+               this.debug("changeSelection: " + appName);
+               var obj = sel.getUserData("PlugIn Object");
+
+               obj.display(globals.appInstance);
+
+       });
+
+       return app_tree;
+}
+
+function addButtonClickHandler(addMenu, el, e) {
+       if (addMenu.isSeeable()) {
+               addMenu.hide();
+       } else {
+               addMenu.setLeft(qx.dom.DomLocation.getPageBoxLeft(el));
+               addMenu.setTop(qx.dom.DomLocation.getPageBoxBottom(el));
+               addMenu.show();
+       };
+}
+
+function removeButtonExecuteHandler() {
+       // Get list of installed plug-in applications.
+       // Display list as a menu
+}
+
+function aboutButtonExecuteHandler(aboutWindow) {
+       aboutWindow.open();
+}
+
+function addMenuButtonExecuteHandler(plugInName, plugIn) {
+       treeRowStructure =
+               qx.ui.treefullcontrol.TreeRowStructure.getInstance().standard(plugInName);
+       var treeElement =
+               new qx.ui.treefullcontrol.TreeFolder(treeRowStructure);
+
+       treeElement.setUserData("PlugIn Name", plugInName);
+       treeElement.setUserData("PlugIn Object", plugIn);
+
+       globals.appTree.add(treeElement);
+
+       // Select the most recently added plugin in the tree-menu.
+       globals.appTree.setSelectedElement(globals.appTree.getLastTreeChild());
+
+       plugIn.display(globals.appInstance);
+}
+
+function createConsoleButtons(mainWindow) {
+       // Get list of available plug-in applications.
+       // Display list of applications as a menu.
+       var addMenu = new qx.ui.menu.Menu();
+       var descriptionMenuButton =
+               new qx.ui.menu.MenuButton("Select a plug-in.");
+       var menuSeparator = new qx.ui.menu.MenuSeparator();
+       var echoMenuButton = new qx.ui.menu.MenuButton("Echo");
+
+       with (echoMenuButton) {
+               addEventListener("execute", function(e) {
+                       this.debug("executed: " + this.getLabel());
+                       var plugIn = new EchoPlugIn();
+                       addMenuButtonExecuteHandler("Echo Test", plugIn);
+               });
+       };
+
+       var NBTStatsMenuButton =
+               new qx.ui.menu.MenuButton("NBT Packet Statistics");
+
+       with (NBTStatsMenuButton) {
+               addEventListener("execute", function(e) {
+                       this.debug("executed: " + this.getLabel());
+                       var plugIn = new NBTStatsPlugIn();
+                       addMenuButtonExecuteHandler("NBT Packet Statistics", plugIn);
+               });
+       };
+
+       addMenu.add(descriptionMenuButton);
+       addMenu.add(menuSeparator);
+       addMenu.add(echoMenuButton);
+       addMenu.add(NBTStatsMenuButton);
+
+       mainWindow.add(addMenu);
+
+       var addButton = new qx.ui.form.Button("Add Plug-in");
+
+       with (addButton) {
+               setTop(0);
+               setLeft(0);
+
+               addEventListener("click", function(e) {
+                       this.debug("clicked: " + this.getLabel());
+                       var el = this.getElement();
+                       addButtonClickHandler(addMenu, el);
+                       e.setPropagationStopped(true);
+               });
+
+               addEventListener("mousedown", function(e) {
+                       this.debug("mousedown: " + this.getLabel());
+                       e.setPropagationStopped(true);
+               });
+
+               setEnabled(true);
+       };
+
+       var removeButton = new qx.ui.form.Button("Remove Plug-in");
+       with (removeButton) {
+               setTop(0);
+               setLeft(66);
+
+               addEventListener("execute", function(e) {
+                       this.debug("Executed: " + this.getLabel());
+                       removeButtonExecuteHandler();
+               });
+
+               setEnabled(true);
+       };
+
+       var aboutWindow = new qx.ui.window.Window("About");
+       aboutWindow.setSpace(100, "auto", 100, "auto");
+       aboutWindow.setModal(false);
+       aboutWindow.setShowMinimize(false);
+       aboutWindow.setShowMaximize(false);
+
+       var aboutText = new qx.ui.basic.Label("Blah.");
+       aboutWindow.add(aboutText);
+
+       mainWindow.add(aboutWindow);
+
+       var aboutButton = new qx.ui.form.Button("About");
+
+       with (aboutButton) {
+               setTop(0);
+               setLeft(154);
+               addEventListener("execute", function(e) {
+                       this.debug("Executed: " + this.getLabel());
+                       aboutButtonExecuteHandler(aboutWindow);
+               });
+               setEnabled(true);
+       };
+
+       mainWindow.add(addButton);
+       mainWindow.add(removeButton);
+       mainWindow.add(aboutButton);
+}
+
+qx.core.Init.getInstance().defineMain(
+       function() {
+               // Enable JSON-RPC debugging.
+               qx.Settings.setCustomOfClass("qx.io.Json", "enableDebug", true);
+
+               var consoleFrame = new qx.ui.layout.CanvasLayout;
+               consoleFrame.setLocation(0,60);
+               consoleFrame.setBottom(120);
+               consoleFrame.setRight(280);
+               consoleFrame.setPadding(20);
+
+               consoleFrame.addToDocument();
+
+               var mainWindow = new qx.ui.window.Window("Console");
+               mainWindow.setSpace(0, 700, 0, 400);
+               mainWindow.allowMinimize = false;
+               mainWindow.showMinimize = false;
+
+               // The default window move method is slow.
+               mainWindow.setMoveMethod("frame");
+
+               consoleFrame.add(mainWindow);
+
+               // We need buttons to add and remove plug-ins.
+               createConsoleButtons(mainWindow);
+
+               // Make a splitpane.
+               globals.paneWidget = new qx.ui.splitpane.HorizontalSplitPane("1*","2*");
+               globals.paneWidget.setEdge(28,0);
+               globals.paneWidget.setLiveResize(true);
+
+               mainWindow.add(globals.paneWidget);
+
+               // plug-in application tree is on the left.
+               globals.appTree = createApplicationTree();
+
+               globals.paneWidget.addLeft(globals.appTree);
+
+               // What is drawn in the right pane is up to the plug-in.
+               // It is a blank canvas for now.
+               globals.appInstance.setTop(0);
+               globals.appInstance.setLeft(0);
+               globals.appInstance.setBottom(50);
+               globals.appInstance.setRight(20);
+
+               globals.paneWidget.addRight(globals.appInstance);
+
+               mainWindow.open();
+       }
+);
+       </SCRIPT>
+</BODY>
+</HTML>
index 255723b95a87484ab8cb7e7ae15004d1df382723..3a32e3f3c79a3fb96a29676a5f3acad0cdcc20f5 100644 (file)
@@ -38,6 +38,7 @@ swat_menus.esptest = simple_menu(
 swat_menus.json = simple_menu(
        "JSON Tests",
        "ldb browser",          session_uri("/apps/samba/utils/ldbbrowse.html"),
+       "admin console",        session_uri("/apps/samba/utils/admin_console.html"),
        "qooxdoo examples",     session_uri("/apps/qooxdoo-examples/index.html"));