Software / code / prosody
Comparison
plugins/mod_admin_telnet.lua @ 4971:bfc52b9137c8
mod_admin_telnet: Replace anonymous function with loop (saves a closure)
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Sun, 22 Jul 2012 18:00:59 +0100 |
| parent | 4913:02dbed57a355 |
| child | 4977:7006ccbf22a9 |
comparison
equal
deleted
inserted
replaced
| 4970:eeff01224865 | 4971:bfc52b9137c8 |
|---|---|
| 74 end | 74 end |
| 75 | 75 |
| 76 function console_listener.onincoming(conn, data) | 76 function console_listener.onincoming(conn, data) |
| 77 local session = sessions[conn]; | 77 local session = sessions[conn]; |
| 78 | 78 |
| 79 -- Handle data | 79 -- Handle data (loop allows us to break to add \0 after response) |
| 80 (function(session, data) | 80 repeat |
| 81 local useglobalenv; | 81 local useglobalenv; |
| 82 | 82 |
| 83 if data:match("^>") then | 83 if data:match("^>") then |
| 84 data = data:gsub("^>", ""); | 84 data = data:gsub("^>", ""); |
| 85 useglobalenv = true; | 85 useglobalenv = true; |
| 86 elseif data == "\004" then | 86 elseif data == "\004" then |
| 87 commands["bye"](session, data); | 87 commands["bye"](session, data); |
| 88 return; | 88 break; |
| 89 else | 89 else |
| 90 local command = data:lower(); | 90 local command = data:lower(); |
| 91 command = data:match("^%w+") or data:match("%p"); | 91 command = data:match("^%w+") or data:match("%p"); |
| 92 if commands[command] then | 92 if commands[command] then |
| 93 commands[command](session, data); | 93 commands[command](session, data); |
| 94 return; | 94 break; |
| 95 end | 95 end |
| 96 end | 96 end |
| 97 | 97 |
| 98 session.env._ = data; | 98 session.env._ = data; |
| 99 | 99 |
| 104 if not chunk then | 104 if not chunk then |
| 105 err = err:gsub("^%[string .-%]:%d+: ", ""); | 105 err = err:gsub("^%[string .-%]:%d+: ", ""); |
| 106 err = err:gsub("^:%d+: ", ""); | 106 err = err:gsub("^:%d+: ", ""); |
| 107 err = err:gsub("'<eof>'", "the end of the line"); | 107 err = err:gsub("'<eof>'", "the end of the line"); |
| 108 session.print("Sorry, I couldn't understand that... "..err); | 108 session.print("Sorry, I couldn't understand that... "..err); |
| 109 return; | 109 break; |
| 110 end | 110 end |
| 111 end | 111 end |
| 112 | 112 |
| 113 setfenv(chunk, (useglobalenv and redirect_output(_G, session)) or session.env or nil); | 113 setfenv(chunk, (useglobalenv and redirect_output(_G, session)) or session.env or nil); |
| 114 | 114 |
| 115 local ranok, taskok, message = pcall(chunk); | 115 local ranok, taskok, message = pcall(chunk); |
| 116 | 116 |
| 117 if not (ranok or message or useglobalenv) and commands[data:lower()] then | 117 if not (ranok or message or useglobalenv) and commands[data:lower()] then |
| 118 commands[data:lower()](session, data); | 118 commands[data:lower()](session, data); |
| 119 return; | 119 break; |
| 120 end | 120 end |
| 121 | 121 |
| 122 if not ranok then | 122 if not ranok then |
| 123 session.print("Fatal error while running command, it did not complete"); | 123 session.print("Fatal error while running command, it did not complete"); |
| 124 session.print("Error: "..taskok); | 124 session.print("Error: "..taskok); |
| 125 return; | 125 break; |
| 126 end | 126 end |
| 127 | 127 |
| 128 if not message then | 128 if not message then |
| 129 session.print("Result: "..tostring(taskok)); | 129 session.print("Result: "..tostring(taskok)); |
| 130 return; | 130 break; |
| 131 elseif (not taskok) and message then | 131 elseif (not taskok) and message then |
| 132 session.print("Command completed with a problem"); | 132 session.print("Command completed with a problem"); |
| 133 session.print("Message: "..tostring(message)); | 133 session.print("Message: "..tostring(message)); |
| 134 return; | 134 break; |
| 135 end | 135 end |
| 136 | 136 |
| 137 session.print("OK: "..tostring(message)); | 137 session.print("OK: "..tostring(message)); |
| 138 end)(session, data); | 138 until true |
| 139 | 139 |
| 140 session.send(string.char(0)); | 140 session.send(string.char(0)); |
| 141 end | 141 end |
| 142 | 142 |
| 143 function console_listener.ondisconnect(conn, err) | 143 function console_listener.ondisconnect(conn, err) |