Mercurial Hosting > luan
diff src/luan/tools/WebShell.java @ 49:8ede219cd111
add WebShell
git-svn-id: https://luan-java.googlecode.com/svn/trunk@50 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Fri, 28 Dec 2012 19:35:04 +0000 |
parents | |
children | 272b6f1d7dac |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/luan/tools/WebShell.java Fri Dec 28 19:35:04 2012 +0000 @@ -0,0 +1,107 @@ +package luan.tools; + +import java.io.IOException; +import java.io.PrintStream; +import java.io.Writer; +import java.io.PrintWriter; +import java.io.ByteArrayOutputStream; +import java.io.OutputStreamWriter; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import luan.LuanFunction; +import luan.LuanState; +import luan.LuanException; +import luan.interp.LuanCompiler; +import luan.lib.BasicLib; +import luan.lib.JavaLib; +import luan.lib.StringLib; +import luan.lib.TableLib; +import luan.lib.HtmlLib; + + +public class WebShell extends HttpServlet { + private static final Logger logger = LoggerFactory.getLogger(WebShell.class); + + protected LuanState newLuanState() { + LuanState luan = LuanCompiler.newLuanState(); + BasicLib.register(luan); + JavaLib.register(luan); + StringLib.register(luan); + TableLib.register(luan); + HtmlLib.register(luan); + return luan; + } + + protected Object[] eval(LuanState luan,String cmd) throws LuanException { + LuanFunction fn = BasicLib.load(luan,cmd,"WebShell"); + return luan.call(fn,null,null); + } + + protected void service(HttpServletRequest request,HttpServletResponse response) + throws ServletException, IOException + { + PrintWriter out = response.getWriter(); + HttpSession session = request.getSession(); + + ByteArrayOutputStream history = (ByteArrayOutputStream)session.getValue("history"); + if( history==null ) { + history = new ByteArrayOutputStream(); + session.putValue("history",history); + } + + if( request.getParameter("clear") != null ) { + history.reset(); + } else { + String cmd = request.getParameter("cmd"); + if( cmd != null ) { + Writer writer = new OutputStreamWriter(history); + writer.write( "% " + HtmlLib.encode(cmd) + "\r\n" ); + try { + LuanState luan = (LuanState)session.getValue("luan"); + if( luan==null ) { + luan = newLuanState(); + session.putValue("luan",luan); + } + luan.out = new PrintStream(history); + luan.global().put("request",request); + luan.global().put("response",response); + Object[] result = eval(luan,cmd); + if( result.length > 0 ) { + for( int i=0; i<result.length; i++ ) { + if( i > 0 ) + writer.write(" "); + writer.write(HtmlLib.encode(luan.toString(null,result[i]))); + } + writer.write("\r\n"); + } + } catch(LuanException e) { + logger.info("",e); + writer.write( HtmlLib.encode(e.toString()) ); + } + writer.flush(); + } + } + + out.println( "<html>" ); + out.println( "<title>Luan Shell</title>" ); + out.println( "<body>" ); + out.println( "<p>This is a command shell. Enter commands below." ); + out.println( "<pre>" + history + "</pre>" ); + out.println( "<form name='theForm' method='post'>" ); + out.println( "% <input name='cmd' size=60>" ); + out.println( "<input type=submit value=run>" ); + out.println( "<input type=submit name=clear value=clear>" ); + out.println( "</form>" ); + + out.println( "<script>document.theForm.cmd.focus();</script>" ); + + out.println( "<p>" ); + out.println( "</body>" ); + out.println( "</html>" ); + } +}