aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortwilson <twilson@f38db490-d61c-443f-a65b-d21fe96a405b>2010-10-13 22:24:44 +0000
committertwilson <twilson@f38db490-d61c-443f-a65b-d21fe96a405b>2010-10-13 22:24:44 +0000
commitc745048a116e09932918340bd165078cf94cbf5c (patch)
treef2e0abee67e83885a595703da11b28c797b85530
parent15fb59b821455de32fc385f8f3a08e4d4d361ef7 (diff)
Add a simple AMI client web page
This patch uses the XML docs to parse all of the available AMI commands and allows you to enter the command name and be presented with a form with the available fields. You can then rapidly tab through the fields and submit the command and view the response. It is much faster/easier than having to use telnet for testing purposes. git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.8@291575 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--Makefile3
-rw-r--r--static-http/mantest.html177
2 files changed, 179 insertions, 1 deletions
diff --git a/Makefile b/Makefile
index 613003ed0..61be67f40 100644
--- a/Makefile
+++ b/Makefile
@@ -449,7 +449,7 @@ distclean: $(SUBDIRS_DIST_CLEAN) _clean
rm -rf doc/api
rm -f build_tools/menuselect-deps
-datafiles: _all
+datafiles: _all doc/core-en_US.xml
CFLAGS="$(_ASTCFLAGS) $(ASTCFLAGS)" build_tools/mkpkgconfig $(DESTDIR)$(libdir)/pkgconfig;
# Should static HTTP be installed during make samples or even with its own target ala
# webvoicemail? There are portions here that *could* be customized but might also be
@@ -458,6 +458,7 @@ datafiles: _all
for x in static-http/*; do \
$(INSTALL) -m 644 $$x $(DESTDIR)$(ASTDATADIR)/static-http ; \
done
+ $(INSTALL) -m 644 doc/core-en_US.xml $(DESTDIR)$(ASTDATADIR)/static-http;
if [ -d doc/tex/asterisk ] ; then \
$(INSTALL) -d $(DESTDIR)$(ASTDATADIR)/static-http/docs ; \
for n in doc/tex/asterisk/* ; do \
diff --git a/static-http/mantest.html b/static-http/mantest.html
new file mode 100644
index 000000000..eebac628b
--- /dev/null
+++ b/static-http/mantest.html
@@ -0,0 +1,177 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <style type="text/css">
+ #container {
+ margin: 0 auto;
+ width: 100%;
+ height: 100%;
+ background: #fff;
+ }
+ #top {
+ float: left;
+ width: 100%;
+ background: #fff;
+ }
+ #bottom {
+ float: left;
+ width: 100%;
+ background: #fff;
+ }
+ #sender {
+ clear: left;
+ float: left;
+ width: 20%;
+ display: inline;
+ overflow: auto;
+ }
+ #output {
+ float: right;
+ width: 79%;
+ display: inline;
+ overflow: auto;
+ border: thin solid black;
+ }
+ .required {
+ color: red;
+ }
+ </style>
+ <title>Manager Utility</title>
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
+
+ <script type="text/javascript">
+
+$(document).ready(function() {
+ $('#output').height($(document).height() - $('#top').height() - 100);
+ $.ajax({
+ type: "GET",
+ url: "core-en_US.xml",
+ dataType: "xml",
+ success: parseXml
+ });
+
+ $("#login").submit(function() {
+ $("#output").empty();
+ submitCommand($(this));
+ $("#command").focus();
+ return false;
+ });
+
+ $("#search_button").click(function() {
+ var command = $("#command").val();
+ $("#command").val("");
+ $("#output").empty();
+ if (commands) {
+ commands.each(function() {
+ if ($(this).attr("name").toLowerCase() == command.toLowerCase()) {
+ buildCommandForm($(this));
+ }
+ });
+ }
+ $('#output').height($(document).height() - $('#top').height() - 100);
+ return false;
+ });
+ $('#command').keyup(function(event) {
+ if (event.keyCode == '13') {
+ return;
+ }
+ var matches = [];
+ var search = $("#command").val().toLowerCase();
+ $("#output").empty();
+ if (search.length && commands) {
+ commands.each(function() {
+ var com = $(this).attr("name").toLowerCase();
+ if (com.substr(0, search.length) === search) {
+ matches.push(com);
+ }
+ });
+ }
+ if (matches.length) {
+ $("#output").append(matches.sort().join("<br/>"));
+ }
+ });
+});
+
+function parseXml(xml) {
+ commands = $(xml).find("manager")
+}
+
+function buildCommandForm(command) {
+ var name = command.attr("name");
+ var i = 0;
+ $("#sendcommand").empty();
+ $("#sendcommand").unbind('submit');
+ $("#sendcommand").append('<label>Action:&nbsp;</label><input name="action" readonly="readonly" value="'+name+'"/><br />');
+ command.find("parameter").each(function() {
+ var param = $(this).attr("name");
+ if (param != "ActionID") {
+ $("#sendcommand").append('<label for="'+param+'">'+param+':&nbsp;</label><input name="'+param+'" /><br />');
+ if ($(this).attr("required")) {
+ $('label[for='+param+']').addClass("required");
+ }
+ if (i == 0) {
+ $("input[name="+param+"]").focus();
+ }
+ i++;
+ }
+ });
+ $("#sendcommand").append('<button type="submit" id="commandbutton">Send</button>');
+ $("#sendcommand").submit(function() {
+ $("#output").empty();
+ submitCommand($(this));
+ $("#command").focus();
+ return false;
+ });
+
+ // If we don't have any fields to fill in, go ahead and submit!
+ if (i == 0) {
+ $("#sendcommand").submit();
+ }
+}
+
+function submitCommand(form) {
+ $.ajax({
+ type: "GET",
+ url: "../rawman",
+ dataType: "text",
+ data: $(form).serializeArray(),
+ success: displayResponse,
+ failure: function() {alert("Error!");}
+ });
+ return false;
+}
+
+function displayResponse(data) {
+ data = data.replace(/\r\n/g, "<br />");
+ $("#output").append(data);
+ return false;
+}
+
+ </script>
+</head>
+
+<body>
+ <div id="container">
+ <div id="top">
+ <form id="login" name="login">
+ <label for="username">Username:&nbsp;</label><input id="username" name="username" />
+ <label for="secret">Secret:&nbsp;</label><input id="secret" name="secret" type="password"/>
+ <input type="hidden" name="action" value="login" />
+ <button id="login_button" type="submit">Submit</button>
+ </form>
+ <hr />
+ <form id="search" name="search">
+ <label for="txt">Action:&nbsp;</label><input name="command" id="command"/>
+ <button id="search_button">Submit</button>
+ </form>
+ </div>
+ <hr />
+ <div id="bottom">
+ <div id="sender">
+ <form id="sendcommand" name="sendcommand"></form>
+ </div>
+ <div id="output"></div>
+ </div>
+ </div>
+</body>
+</html>