Diff

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
line wrap: on
line diff
--- a/plugins/mod_admin_telnet.lua	Fri Dec 28 20:56:01 2018 +0100
+++ b/plugins/mod_admin_telnet.lua	Thu Dec 27 02:53:34 2018 +0100
@@ -31,6 +31,7 @@
 local envload = require "util.envload".envload;
 local envloadfile = require "util.envload".envloadfile;
 local has_pposix, pposix = pcall(require, "util.pposix");
+local async = require "util.async";
 
 local commands = module:shared("commands")
 local def_env = module:shared("env");
@@ -48,6 +49,21 @@
 
 console = {};
 
+local runner_callbacks = {};
+
+function runner_callbacks:ready()
+	self.data.conn:resume();
+end
+
+function runner_callbacks:waiting()
+	self.data.conn:pause();
+end
+
+function runner_callbacks:error(err)
+	module:log("error", "Traceback[telnet]: %s", err);
+end
+
+
 function console:new_session(conn)
 	local w = function(s) conn:write(s:gsub("\n", "\r\n")); end;
 	local session = { conn = conn;
@@ -63,6 +79,11 @@
 			};
 	session.env = setmetatable({}, default_env_mt);
 
+	session.thread = async.runner(function (line)
+		console:process_line(session, line);
+		session.send(string.char(0));
+	end, runner_callbacks, session);
+
 	-- Load up environment with helper objects
 	for name, t in pairs(def_env) do
 		if type(t) == "table" then
@@ -151,8 +172,7 @@
 
 	for line in data:gmatch("[^\n]*[\n\004]") do
 		if session.closed then return end
-		console:process_line(session, line);
-		session.send(string.char(0));
+		session.thread:run(line);
 	end
 	session.partial_data = data:match("[^\n]+$");
 end