Comparison

plugins/mod_admin_telnet.lua @ 9735:2d8ca54ecbc6

mod_admin_telnet: Enable async processing using util.async
author Kim Alvefur <zash@zash.se>
date Thu, 27 Dec 2018 02:53:34 +0100
parent 9734:cc01bb7a3305
child 9736:a5ae3f4e1a40
comparison
equal deleted inserted replaced
9734:cc01bb7a3305 9735:2d8ca54ecbc6
29 local set, array = require "util.set", require "util.array"; 29 local set, array = require "util.set", require "util.array";
30 local cert_verify_identity = require "util.x509".verify_identity; 30 local cert_verify_identity = require "util.x509".verify_identity;
31 local envload = require "util.envload".envload; 31 local envload = require "util.envload".envload;
32 local envloadfile = require "util.envload".envloadfile; 32 local envloadfile = require "util.envload".envloadfile;
33 local has_pposix, pposix = pcall(require, "util.pposix"); 33 local has_pposix, pposix = pcall(require, "util.pposix");
34 local async = require "util.async";
34 35
35 local commands = module:shared("commands") 36 local commands = module:shared("commands")
36 local def_env = module:shared("env"); 37 local def_env = module:shared("env");
37 local default_env_mt = { __index = def_env }; 38 local default_env_mt = { __index = def_env };
38 39
45 end; 46 end;
46 return env; 47 return env;
47 end 48 end
48 49
49 console = {}; 50 console = {};
51
52 local runner_callbacks = {};
53
54 function runner_callbacks:ready()
55 self.data.conn:resume();
56 end
57
58 function runner_callbacks:waiting()
59 self.data.conn:pause();
60 end
61
62 function runner_callbacks:error(err)
63 module:log("error", "Traceback[telnet]: %s", err);
64 end
65
50 66
51 function console:new_session(conn) 67 function console:new_session(conn)
52 local w = function(s) conn:write(s:gsub("\n", "\r\n")); end; 68 local w = function(s) conn:write(s:gsub("\n", "\r\n")); end;
53 local session = { conn = conn; 69 local session = { conn = conn;
54 send = function (t) w(tostring(t)); end; 70 send = function (t) w(tostring(t)); end;
61 end; 77 end;
62 disconnect = function () conn:close(); end; 78 disconnect = function () conn:close(); end;
63 }; 79 };
64 session.env = setmetatable({}, default_env_mt); 80 session.env = setmetatable({}, default_env_mt);
65 81
82 session.thread = async.runner(function (line)
83 console:process_line(session, line);
84 session.send(string.char(0));
85 end, runner_callbacks, session);
86
66 -- Load up environment with helper objects 87 -- Load up environment with helper objects
67 for name, t in pairs(def_env) do 88 for name, t in pairs(def_env) do
68 if type(t) == "table" then 89 if type(t) == "table" then
69 session.env[name] = setmetatable({ session = session }, { __index = t }); 90 session.env[name] = setmetatable({ session = session }, { __index = t });
70 end 91 end
149 data = partial..data; 170 data = partial..data;
150 end 171 end
151 172
152 for line in data:gmatch("[^\n]*[\n\004]") do 173 for line in data:gmatch("[^\n]*[\n\004]") do
153 if session.closed then return end 174 if session.closed then return end
154 console:process_line(session, line); 175 session.thread:run(line);
155 session.send(string.char(0));
156 end 176 end
157 session.partial_data = data:match("[^\n]+$"); 177 session.partial_data = data:match("[^\n]+$");
158 end 178 end
159 179
160 function console_listener.onreadtimeout(conn) 180 function console_listener.onreadtimeout(conn)