annotate src/luan/modules/http/tools/Shell.luan @ 1245:2de84f128be3

minor
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 16 Jul 2018 17:26:45 -0600
parents a50803fde972
children 5ba660381bd5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 ipairs = Luan.ipairs or error()
18504c41b0be move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents: 506
diff changeset
4 local load = Luan.load or error()
1159
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
5 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
6 local try = Luan.try or error()
1159
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
7 local String = require "luan:String.luan"
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
8 local concat = String.concat or error()
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
9 local Time = require "luan:Time.luan"
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
10 local Thread = require "luan:Thread.luan"
693
ca169567ce07 module URIs must now include ".luan"
Franklin Schmidt <fschmidt@gmail.com>
parents: 609
diff changeset
11 local Io = require "luan:Io.luan"
554
18504c41b0be move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents: 506
diff changeset
12 local print = Io.print or error()
693
ca169567ce07 module URIs must now include ".luan"
Franklin Schmidt <fschmidt@gmail.com>
parents: 609
diff changeset
13 local Http = require "luan:http/Http.luan"
1159
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
14 local Logging = require "luan:logging/Logging.luan"
1218
a50803fde972 http/tools cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1216
diff changeset
15 local logger = Logging.logger "Shell"
560
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
16
139
3b384dc5ca91 replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
17
1218
a50803fde972 http/tools cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1216
diff changeset
18 local Shell = {}
503
92c3d22745b8 make _ENV optional
Franklin Schmidt <fschmidt@gmail.com>
parents: 497
diff changeset
19
1159
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
20 local forever = Time.period{days=1000000}
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
21 local count = 0
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
22 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
23 count = count + 1
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
24 return to_string(count)
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
25 end}).next
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
26
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
27 local history = ""
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
28 local env = {}
1218
a50803fde972 http/tools cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1216
diff changeset
29 Shell.env = env
1159
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 fns = {}
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
32
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
33 function fns.history()
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
34 return history
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
35 end
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
36
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
37 function fns.run(cmd)
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
38 Io.stdout = {}
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
39 Io.stdout.write = function(...)
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
40 history = concat(history,...)
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
41 end
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
42 print( "% "..cmd )
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
43 try {
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
44 function()
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
45 local line
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
46 try {
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
47 function()
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
48 line = load("return "..cmd,"<web_shell>",env)
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)
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
51 line = load(cmd,"<web_shell>",env)
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
52 end
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
53 }
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
54 print( line() )
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 catch = function(e)
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
57 Io.print_to(Io.stderr,e)
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
58 print(e)
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
59 end
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
60 }
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
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
63 local timeout = Time.period{hours=10}
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
64
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
65 local function get_session(session_id)
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
66 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
67 end
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
68
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
69 local function remove_session(session_id)
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
70 return Thread.remove_global_callable("shell.session"..session_id)
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
71 end
139
3b384dc5ca91 replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
72
1218
a50803fde972 http/tools cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1216
diff changeset
73 function Shell.respond()
1245
Franklin Schmidt <fschmidt@gmail.com>
parents: 1218
diff changeset
74 local session_id = Http.request.cookies["session"]
1159
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
75 if session_id == nil then
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
76 session_id = new_session()
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
77 Http.response.set_cookie("session",session_id)
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
78 end
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
79 local session = get_session(session_id)
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
80
1152
21d157b153fe change http parameters interface
Franklin Schmidt <fschmidt@gmail.com>
parents: 1088
diff changeset
81 if Http.request.parameters.clear ~= nil then
1159
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
82 remove_session(session_id)
609
24b05963ba62 shell "clear" button now clears the session
Franklin Schmidt <fschmidt@gmail.com>
parents: 560
diff changeset
83 Http.response.send_redirect(Http.request.path) -- reload page
24b05963ba62 shell "clear" button now clears the session
Franklin Schmidt <fschmidt@gmail.com>
parents: 560
diff changeset
84 return
139
3b384dc5ca91 replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
85 else
1152
21d157b153fe change http parameters interface
Franklin Schmidt <fschmidt@gmail.com>
parents: 1088
diff changeset
86 local cmd = Http.request.parameters.cmd
139
3b384dc5ca91 replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
87 if cmd ~= nil then
1159
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
88 session.run(cmd)
139
3b384dc5ca91 replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
89 end
3b384dc5ca91 replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
90 end
3b384dc5ca91 replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
91
325
78a6a71afbfd use SimplyHTML
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 321
diff changeset
92 Io.stdout = Http.response.text_writer()
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 %>
1216
5dbb552075ff doctype
Franklin Schmidt <fschmidt@gmail.com>
parents: 1177
diff changeset
94 <!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
95 <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
96 <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
97 <title>Luan Shell</title>
560
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
98 <style>
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
99 body {
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
100 font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
101 margin: 2em 5% 0 5%;
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
102 }
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
103 pre {
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
104 font: inherit;
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
105 }
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
106 input[type="text"] {
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
107 font: inherit;
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
108 padding: .5em .8em;
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
109 border-radius: 8px;
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
110 border-style: groove;
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
111 }
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
112 input[type="text"]:focus {
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
113 border-color: #66afe9;
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
114 outline: none;
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
115 }
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
116 input[type="submit"] {
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
117 color: white;
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
118 background: #337ab7;
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
119 border-color: #337ab7;
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
120 font: inherit;
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
121 padding: .5em;
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
122 border-radius: 4px;
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
123 }
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
124 input[type="submit"]:hover {
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
125 background: #236aa7 !important;
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
126 }
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
127 </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
128 </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
129 <body>
560
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
130 <h2>Luan Shell</h2>
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
131 <p>This is a command shell. Enter commands below.</p>
1159
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1152
diff changeset
132 <pre><%= session.history() %></pre>
1245
Franklin Schmidt <fschmidt@gmail.com>
parents: 1218
diff changeset
133 <form method='post'>
560
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
134 % <input type="text" name='cmd' size="80" autofocus>
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
135 <input type="submit" value="run">
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
136 <input type="submit" name="clear" value="clear">
2f39468680be remove SimplyHTML from shell
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
137 </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
138 </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
139 </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
140 <%
139
3b384dc5ca91 replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
141 end
503
92c3d22745b8 make _ENV optional
Franklin Schmidt <fschmidt@gmail.com>
parents: 497
diff changeset
142
1218
a50803fde972 http/tools cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1216
diff changeset
143 return Shell