Comparison

plugins/mod_admin_telnet.lua @ 5186:ad898e50b8f3

mod_admin_telnet: Refactor so that command processing is performed in a separate function (usable from other modules)
author Matthew Wild <mwild1@gmail.com>
date Thu, 22 Nov 2012 18:32:27 +0000
parent 5168:46fc0eff10b4
child 5227:97f395938028
comparison
equal deleted inserted replaced
5185:ca30b21946ef 5186:ad898e50b8f3
70 end 70 end
71 71
72 return session; 72 return session;
73 end 73 end
74 74
75 function console:process_line(session, line)
76 local useglobalenv;
77
78 if line:match("^>") then
79 line = line:gsub("^>", "");
80 useglobalenv = true;
81 elseif line == "\004" then
82 commands["bye"](session, line);
83 return;
84 else
85 local command = line:match("^%w+") or line:match("%p");
86 if commands[command] then
87 commands[command](session, line);
88 return;
89 end
90 end
91
92 session.env._ = line;
93
94 local chunkname = "=console";
95 local env = (useglobalenv and redirect_output(_G, session)) or session.env or nil
96 local chunk, err = envload("return "..line, chunkname, env);
97 if not chunk then
98 chunk, err = envload(line, chunkname, env);
99 if not chunk then
100 err = err:gsub("^%[string .-%]:%d+: ", "");
101 err = err:gsub("^:%d+: ", "");
102 err = err:gsub("'<eof>'", "the end of the line");
103 session.print("Sorry, I couldn't understand that... "..err);
104 return;
105 end
106 end
107
108 local ranok, taskok, message = pcall(chunk);
109
110 if not (ranok or message or useglobalenv) and commands[line:lower()] then
111 commands[line:lower()](session, line);
112 return;
113 end
114
115 if not ranok then
116 session.print("Fatal error while running command, it did not complete");
117 session.print("Error: "..taskok);
118 return;
119 end
120
121 if not message then
122 session.print("Result: "..tostring(taskok));
123 return;
124 elseif (not taskok) and message then
125 session.print("Command completed with a problem");
126 session.print("Message: "..tostring(message));
127 return;
128 end
129
130 session.print("OK: "..tostring(message));
131 end
132
75 local sessions = {}; 133 local sessions = {};
76 134
77 function console_listener.onconnect(conn) 135 function console_listener.onconnect(conn)
78 -- Handle new connection 136 -- Handle new connection
79 local session = console:new_session(conn); 137 local session = console:new_session(conn);
89 if partial then 147 if partial then
90 data = partial..data; 148 data = partial..data;
91 end 149 end
92 150
93 for line in data:gmatch("[^\n]*[\n\004]") do 151 for line in data:gmatch("[^\n]*[\n\004]") do
94 -- Handle data (loop allows us to break to add \0 after response) 152 console:process_line(session, line);
95 repeat
96 local useglobalenv;
97
98 if line:match("^>") then
99 line = line:gsub("^>", "");
100 useglobalenv = true;
101 elseif line == "\004" then
102 commands["bye"](session, line);
103 break;
104 else
105 local command = line:match("^%w+") or line:match("%p");
106 if commands[command] then
107 commands[command](session, line);
108 break;
109 end
110 end
111
112 session.env._ = line;
113
114 local chunkname = "=console";
115 local env = (useglobalenv and redirect_output(_G, session)) or session.env or nil
116 local chunk, err = envload("return "..line, chunkname, env);
117 if not chunk then
118 chunk, err = envload(line, chunkname, env);
119 if not chunk then
120 err = err:gsub("^%[string .-%]:%d+: ", "");
121 err = err:gsub("^:%d+: ", "");
122 err = err:gsub("'<eof>'", "the end of the line");
123 session.print("Sorry, I couldn't understand that... "..err);
124 break;
125 end
126 end
127
128 local ranok, taskok, message = pcall(chunk);
129
130 if not (ranok or message or useglobalenv) and commands[line:lower()] then
131 commands[line:lower()](session, line);
132 break;
133 end
134
135 if not ranok then
136 session.print("Fatal error while running command, it did not complete");
137 session.print("Error: "..taskok);
138 break;
139 end
140
141 if not message then
142 session.print("Result: "..tostring(taskok));
143 break;
144 elseif (not taskok) and message then
145 session.print("Command completed with a problem");
146 session.print("Message: "..tostring(message));
147 break;
148 end
149
150 session.print("OK: "..tostring(message));
151 until true
152
153 session.send(string.char(0)); 153 session.send(string.char(0));
154 end 154 end
155 session.partial_data = data:match("[^\n]+$"); 155 session.partial_data = data:match("[^\n]+$");
156 end 156 end
157 157