This repository has been archived by the owner on Sep 2, 2019. It is now read-only.
/
server.js
71 lines (65 loc) · 2.31 KB
/
server.js
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
// ===================================
// `tail -f` in Node.js and WebSockets
// ===================================
var http = require('http'),
io = require('socket.io'),
fs = require('fs');
var backlog_size = 5000;
var log_dir = "/var/log/";
var logs = [];
// look up the dir for logs
fs.readdir(log_dir, function(err,files){
if(err) throw err;
files = Array.prototype.sort.apply(files,[]);
for(var file in files){
file = files[file];
if(fs.statSync(log_dir+file).isFile()) logs.push(file);
}
});
// -- Node.js HTTP Server ----------------------------------------------------------
server = http.createServer(function(req, res){
res.writeHead(200, {'Content-Type': 'text/html'})
fs.readFile(__dirname + '/index.html', function(err, data){
res.write(data, 'utf8');
res.end();
});
})
server.listen(8000);
// -- Setup Socket.IO ---------------------------------------------------------
var socket = io.listen(server);
socket.on('connection', function(client){
var filename;
client.send( { logs : logs } );
client.on("message",function(message){
if(message.log){
// Stop watching the last file and send the new one
fs.unwatchFile(filename);
filename = log_dir + message.log;
client.send({filename: filename});
// send some back log
fs.stat(filename,function(err,stats){
if (err) throw err;
var start = (stats.size > backlog_size)?(stats.size - backlog_size):0;
var stream = fs.createReadStream(filename,{start:start, end:stats.size});
stream.addListener("data", function(lines){
lines = lines.toString('utf-8');
lines = lines.slice(lines.indexOf("\n")+1).split("\n");
client.send({ tail : lines});
});
});
// watch the file now
fs.watchFile(filename, function(curr, prev) {
if(prev.size > curr.size) return {clear:true};
var stream = fs.createReadStream(filename, { start: prev.size, end: curr.size});
stream.addListener("data", function(lines) {
client.send({ tail : lines.toString('utf-8').split("\n") });
});
});
// stop watching the file
client.on("disconnect",function(){
fs.unwatchFile(filename);
});
}
});
});
console.log('Log Server running now at http://[HOSTNAME]:8000/ in your browser');