Mercurial Hosting > luan
annotate src/luan/modules/http/tools/Shell.luan @ 1300:590ad449ac7f
improve web shell
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 13 Jan 2019 15:31:39 -0700 |
parents | 9dca1e912658 |
children | d5739c101bd6 |
rev | line source |
---|---|
693
ca169567ce07
module URIs must now include ".luan"
Franklin Schmidt <fschmidt@gmail.com>
parents:
609
diff
changeset
|
1 local Luan = require "luan:Luan.luan" |
554
18504c41b0be
move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents:
506
diff
changeset
|
2 local error = Luan.error |
18504c41b0be
move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents:
506
diff
changeset
|
3 local load = Luan.load or error() |
1159
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
4 local to_string = Luan.to_string or error() |
554
18504c41b0be
move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents:
506
diff
changeset
|
5 local try = Luan.try or error() |
1295 | 6 local range = Luan.range or error() |
1277 | 7 local Table = require "luan:Table.luan" |
1295 | 8 local concat = Table.concat or error() |
1277 | 9 local pack = Table.pack or error() |
10 local unpack = Table.unpack or error() | |
1159
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
11 local Time = require "luan:Time.luan" |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
12 local Thread = require "luan:Thread.luan" |
1295 | 13 local Html = require "luan:Html.luan" |
14 local html_encode = Html.encode or error() | |
15 local javascript_encode = Html.javascript_encode or error() | |
693
ca169567ce07
module URIs must now include ".luan"
Franklin Schmidt <fschmidt@gmail.com>
parents:
609
diff
changeset
|
16 local Io = require "luan:Io.luan" |
ca169567ce07
module URIs must now include ".luan"
Franklin Schmidt <fschmidt@gmail.com>
parents:
609
diff
changeset
|
17 local Http = require "luan:http/Http.luan" |
1159
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
18 local Logging = require "luan:logging/Logging.luan" |
1218 | 19 local logger = Logging.logger "Shell" |
560
2f39468680be
remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents:
554
diff
changeset
|
20 |
139
3b384dc5ca91
replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
21 |
1218 | 22 local Shell = {} |
503 | 23 |
1159
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
24 local forever = Time.period{days=1000000} |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
25 local count = 0 |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
26 local new_session = Thread.global_callable("shell.new_session",forever,{next=function() |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
27 count = count + 1 |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
28 return to_string(count) |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
29 end}).next |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
30 |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
31 local env = {} |
1218 | 32 Shell.env = env |
1159
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
33 |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
34 local fns = {} |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
35 |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
36 function fns.run(cmd) |
1295 | 37 return try { |
1159
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
38 function() |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
39 local line |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
40 try { |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
41 function() |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
42 line = load("return "..cmd,"<web_shell>",env) |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
43 end |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
44 catch = function(e) |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
45 line = load(cmd,"<web_shell>",env) |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
46 end |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
47 } |
1295 | 48 return line() |
1159
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
49 end |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
50 catch = function(e) |
1295 | 51 -- Io.print_to(Io.stderr,e) |
52 return to_string(e) | |
1159
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
53 end |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
54 } |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
55 end |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
56 |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
57 local timeout = Time.period{hours=10} |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
58 |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
59 local function get_session(session_id) |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
60 return Thread.global_callable("shell.session"..session_id,timeout,fns) |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
61 end |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
62 |
1218 | 63 function Shell.respond() |
1295 | 64 Io.stdout = Http.response.text_writer() |
65 local cmd = Http.request.parameters.cmd | |
66 if cmd ~= nil then | |
67 Http.response.headers["content-type"] = "application/javascript" | |
68 local session_id = Http.request.parameters.session or error() | |
69 local session = get_session(session_id) | |
70 local rtn = pack( session.run(cmd) ) | |
71 %> | |
72 var pre = document.querySelector('pre'); | |
73 pre.innerHTML += '\n> <%=javascript_encode(html_encode(cmd))%>'; | |
74 <% | |
75 if rtn.n > 0 then | |
76 local t = {} | |
77 for i in range(1,rtn.n) do | |
78 t[#t+1] = javascript_encode(html_encode(to_string(rtn[i]))) | |
79 end | |
80 %> | |
81 pre.innerHTML += '\n<%=concat(t,"\t")%>'; | |
82 <% | |
83 end | |
1300 | 84 %> |
85 var input = document.querySelector('input'); | |
86 input.scrollIntoView(); | |
87 input.blur(); input.focus(); // because Chrome is retarded | |
88 <% | |
1295 | 89 return |
1159
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1152
diff
changeset
|
90 end |
391
2f5cc9c2cbf0
replace Html.simply_html_page with simply_html_head and simply_html_body_bottom
Franklin Schmidt <fschmidt@gmail.com>
parents:
347
diff
changeset
|
91 %> |
1216 | 92 <!doctype html> |
391
2f5cc9c2cbf0
replace Html.simply_html_page with simply_html_head and simply_html_body_bottom
Franklin Schmidt <fschmidt@gmail.com>
parents:
347
diff
changeset
|
93 <html> |
2f5cc9c2cbf0
replace Html.simply_html_page with simply_html_head and simply_html_body_bottom
Franklin Schmidt <fschmidt@gmail.com>
parents:
347
diff
changeset
|
94 <head> |
2f5cc9c2cbf0
replace Html.simply_html_page with simply_html_head and simply_html_body_bottom
Franklin Schmidt <fschmidt@gmail.com>
parents:
347
diff
changeset
|
95 <title>Luan Shell</title> |
1295 | 96 <script> |
97 | |
98 function ajax(url) { | |
99 var request = new XMLHttpRequest(); | |
100 request.open( 'GET', url ); | |
101 request.onload = function() { | |
102 if( request.status !== 200 ) { | |
103 console.log( 'ajax failed: ' + request.status ); | |
104 return; | |
105 } | |
106 //console.log( request.responseText ); | |
107 eval( request.responseText ); | |
108 }; | |
109 request.send(); | |
110 } | |
111 | |
112 function submitted() { | |
113 var input = document.querySelector('input'); | |
114 ajax( '?session=<%=new_session()%>&cmd=' + encodeURIComponent(input.value) ); | |
115 input.value = ''; | |
116 } | |
117 | |
118 </script> | |
560
2f39468680be
remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents:
554
diff
changeset
|
119 <style> |
2f39468680be
remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents:
554
diff
changeset
|
120 body { |
1293 | 121 font-family: sans-serif; |
560
2f39468680be
remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents:
554
diff
changeset
|
122 } |
2f39468680be
remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents:
554
diff
changeset
|
123 pre { |
2f39468680be
remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents:
554
diff
changeset
|
124 font: inherit; |
1295 | 125 margin-bottom: 0; |
560
2f39468680be
remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents:
554
diff
changeset
|
126 } |
1295 | 127 table { |
128 width: 100%; | |
129 border-collapse: collapse; | |
560
2f39468680be
remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents:
554
diff
changeset
|
130 } |
1295 | 131 td { |
132 padding: 0; | |
133 } | |
134 td:last-child { | |
135 width: 100%; | |
136 } | |
137 input { | |
138 width: 100%; | |
560
2f39468680be
remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents:
554
diff
changeset
|
139 font: inherit; |
1295 | 140 outline: none; |
560
2f39468680be
remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents:
554
diff
changeset
|
141 } |
2f39468680be
remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents:
554
diff
changeset
|
142 </style> |
391
2f5cc9c2cbf0
replace Html.simply_html_page with simply_html_head and simply_html_body_bottom
Franklin Schmidt <fschmidt@gmail.com>
parents:
347
diff
changeset
|
143 </head> |
2f5cc9c2cbf0
replace Html.simply_html_page with simply_html_head and simply_html_body_bottom
Franklin Schmidt <fschmidt@gmail.com>
parents:
347
diff
changeset
|
144 <body> |
1295 | 145 <pre>Luan <%=Luan.VERSION%></pre> |
1300 | 146 <form onsubmit="submitted(); return false"> |
1295 | 147 <table> |
148 <tr> | |
149 <td>> </td> | |
150 <td><input name=cmd autofocus></td> | |
151 </tr> | |
152 </table> | |
560
2f39468680be
remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents:
554
diff
changeset
|
153 </form> |
391
2f5cc9c2cbf0
replace Html.simply_html_page with simply_html_head and simply_html_body_bottom
Franklin Schmidt <fschmidt@gmail.com>
parents:
347
diff
changeset
|
154 </body> |
2f5cc9c2cbf0
replace Html.simply_html_page with simply_html_head and simply_html_body_bottom
Franklin Schmidt <fschmidt@gmail.com>
parents:
347
diff
changeset
|
155 </html> |
2f5cc9c2cbf0
replace Html.simply_html_page with simply_html_head and simply_html_body_bottom
Franklin Schmidt <fschmidt@gmail.com>
parents:
347
diff
changeset
|
156 <% |
139
3b384dc5ca91
replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
157 end |
503 | 158 |
1218 | 159 return Shell |