-- UNIX Finger Example local function WriteForm(host, user) Write([[<!doctype html> <title>redbean unix finger demo</title> <style> body { padding: 1em; } h1 a { color: inherit; text-decoration: none; } h1 img { border: none; vertical-align: middle; } input { margin: .5em; padding: .25em; } pre { margin-left: 2em; } p { word-break: break-word; max-width: 650px; } dt { font-weight: bold; } dd { margin-top: 1em; margin-bottom: 1em; } .hdr { text-indent: -1em; padding-left: 1em; } </style> <h1> <a href="/"><img src="/redbean.png"></a> <a href="unix-finger.lua">redbean unix finger demo</a> </h1> <p> Your redbean is able to function as an finger client. Lua server pages can use the <code>unix</code> module to implement protocols that your redbean wasn't originally intended to support. All it takes is few lines of code! </p> <form action="unix-finger.lua" method="post"> <input type="text" id="host" name="host" size="40" value="%s" placeholder="host" autofocus> <label for="host">host</label> <br> <input type="text" id="user" name="user" size="40" value="%s" placeholder="user"> <label for="user">user</label> <br> <input type="submit" value="finger"> </form> ]] % {EscapeHtml(host), EscapeHtml(user)}) end local function main() if IsPublicIp(GetClientAddr()) then ServeError(403) elseif GetMethod() == 'GET' or GetMethod() == 'HEAD' then WriteForm('graph.no', 'new_york') elseif GetMethod() == 'POST' then ip = assert(ResolveIp(GetParam('host'))) fd = assert(unix.socket()) assert(unix.connect(fd, ip, 79)) assert(unix.write(fd, GetParam('user') .. '\r\n')) response = '' while true do data = assert(unix.read(fd)) if data == '' then break end response = response .. data end assert(unix.close(fd)) WriteForm(GetParam('host'), GetParam('user')) Write('<pre>\r\n') Write(EscapeHtml(VisualizeControlCodes(response))) Write('</pre>\r\n') else ServeError(405) SetHeader('Allow', 'GET, HEAD, POST') end end main()