1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
if mg.lua_type ~= "websocket" then
mg.write("HTTP/1.0 200 OK\r\n")
mg.write("Connection: close\r\n")
mg.write("\r\n")
mg.write("<!DOCTYPE HTML>\r\n")
mg.write("<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n")
mg.write("<head>\r\n")
mg.write("<meta charset=\"UTF-8\"></meta>\r\n")
mg.write("<title>Server stats</title>\r\n")
mg.write("</head>\r\n")
mg.write("<body onload=\"load()\">\r\n")
mg.write([====[
<script type="text/javascript">
var connection;
var data_field;
function webSockKeepAlive() {
if (keepAlive) {
connection.send('Ok');
setTimeout("webSockKeepAlive()", 10000);
}
}
function load() {
var wsproto = (location.protocol === 'https:') ? "wss:" : "ws:";
connection = new WebSocket(wsproto + "//" + window.location.host + window.location.pathname);
data_field = document.getElementById('data');
data_field.innerHTML = "wait for data";
use_keepAlive = true;
connection.onopen = function () {
keepAlive = use_keepAlive;
webSockKeepAlive();
};
// Log errors
connection.onerror = function (error) {
keepAlive = false;
alert("WebSocket error");
connection.close();
};
// Log messages from the server
connection.onmessage = function (e) {
data_field.innerHTML = e.data;
};
}
</script>
]====])
mg.write("<div id='data'>Wait for page load</div>\r\n")
mg.write("</body>\r\n")
mg.write("</html>\r\n")
return
end
function table.count(tab)
local count = 0
for _ in pairs(tab) do
count = count + 1
end
return count
end
-- table of all active connection
allConnections = {}
connCount = table.count(allConnections)
-- function to get a client identification string
function who(tab)
local ri = allConnections[tab.client].request_info
return ri.remote_addr .. ":" .. ri.remote_port
end
-- Callback to accept or reject a connection
function open(tab)
allConnections[tab.client] = tab
connCount = table.count(allConnections)
return true -- return true to accept the connection
end
-- Callback for "Websocket ready"
function ready(tab)
senddata()
return true -- return true to keep the connection open
end
-- Callback for "Websocket received data"
function data(tab)
senddata()
return true -- return true to keep the connection open
end
-- Callback for "Websocket is closing"
function close(tab)
allConnections[tab.client] = nil
connCount = table.count(allConnections)
end
function senddata()
local date = os.date('*t');
collectgarbage("collect"); -- Avoid adding uncollected Lua memory from this state
mg.write(string.format([[
{"Time": "%u:%02u:%02u",
"Date": "%04u-%02u-%02u",
"Context": %s,
"Common": %s,
"System": \"%s\",
"ws_status": {"Memory": %u, "Connections": %u}
}]],
date.hour, date.min, date.sec,
date.year, date.month, date.day,
mg.get_info("context"),
mg.get_info("common"),
mg.get_info("system"),
collectgarbage("count")*1024,
connCount
));
end
function timer()
senddata()
mg.set_timeout("timer()", 1)
end
mg.set_timeout("timer()", 1)
|