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
|
var fs = require('fs');
var http = require('https');
var sockjs = require('sockjs');
var connect = require('connect');
var irc = require('irc');
var Clients = [];
Clients.broadcast = function(object) { //broadcast to all clients
Clients.forEach(function(client) {
client.write(JSON.stringify(object));
});
}
var irc_reconnect = function() { //reconnt to irc
console.log("reconnecting due to pingtimeout");
irc_client.disconnect();
irc_client.connect();
}
var pingTimeoutDelay = 3*60*1000
var lastping = setTimeout(irc_reconnect, pingTimeoutDelay)
var irc_client = new irc.Client('irc.freenode.net', 'kweb', { //create irc_client to talk to irc
channels: ['#krebs'], //todo: read from local_config
sasl: true,
secure: true,
userName: 'kweb', //todo: read from local_config
realName: 'kweb', //todo: read from local_config
password: fs.readFileSync(__dirname+'/local_config/irc.key').toString(),
debug: false,
showErrors: true,
floodProtection: true,
port: 6697,
autoRejoin: true,
autoConnect: true,
stripColors: true
});
irc_client.on('ping', function(server) { //restart timer on server ping
console.log("got ping from server, renewing timeout for automatic reconnect");
clearTimeout(lastping);
lastping = setTimeout(irc_reconnect, pingTimeoutDelay); //reconnect after irc timeout
})
irc_client.on('message#krebs', function(from, message) {
console.log({ from: from, message: message });
Clients.broadcast({ from: from, message: message }); //broadcast irc messages to all connected clients
clearTimeout(lastping);
});
var web_serv_options = { //certificates for https
key: fs.readFileSync(__dirname+'/local_config/server_npw.key'),
cert: fs.readFileSync(__dirname+'/local_config/server.crt'),
};
var echo = sockjs.createServer();
echo.on('connection', function(conn) {
var origin = conn.remoteAddress;
Clients.push(conn);
Clients.broadcast({from: 'system', message: origin + ' has joined'})
// irc_client.say("#krebs", origin + ' has joined');
conn.write(JSON.stringify({from: 'system', message: 'hello'})) //welcome message
conn.on('data', function(data) {
console.log('data:',data);
try {
var object = JSON.parse(data);
if (object.message.length > 0) { //if message is not empty
if (/^\/nick\s+(.+)$/.test(object.message)) { //if nick is send use nick instead of ip
object.from = origin;
} else if (typeof object.nick === 'string') {
object.from = object.nick;
} else {
object.from = origin;
};
console.log(object.message);
irc_client.say("#krebs", object.from + ' → ' + object.message);
Clients.broadcast(object);
}
} catch (error) {
console.log(error);
}
});
conn.on('close', function() { //propagate if client quits the page
Clients.splice(Clients.indexOf(conn));
Clients.broadcast({from: 'system', message: origin + ' has quit'})
// irc_client.say("#krebs", origin + ' has quit');
});
});
var app = connect()
.use(connect.logger('dev'))
.use(connect.static(__dirname+'/public'))
.use( function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
page_template='<!doctype html>\n';
page_template+='<link rel="stylesheet" type="text/css" href="reset.css">\n';
page_template+='<script src="sockjs-0.3.min.js"></script>\n';
page_template+='<script src="jquery-2.0.3.min.js"></script>\n';
page_template+='<script src="client.js"></script>\n';
page_template+='<div id="bg">';
page_template+='<div id="chatter">';
page_template+='<div id="space"></div>';
page_template+='hello, this is the official krebs support:<br>\n';
page_template+='<table id="chatbox"><tr id="foot"><td id="time"></td><td id="nick" class="chat_from"></td><td><input type="text" id="input"></td></tr></table>\n';
page_template+='</div>';
page_template+='<div id="sideboard"><div id="links">';
page_template+='<a href="http://ire:1027/">Retiolum Dashboard</a><br>';
page_template+='<a href="http://pigstarter/">Pigstarter network graphs</a><br>';
page_template+='</div></div></div>';
res.end(page_template);
})
var server = http.createServer(web_serv_options, app);
echo.installHandlers(server, {prefix:'/echo'});
server.listen(1337, '0.0.0.0');
console.log('Server running at https://127.0.0.1:1337/');
|