var fs = require('fs'),
_ = require('lodash'),
+ util = require('util'),
WebListener = require('./weblistener.js'),
config = require('./configuration.js'),
- rehash = require('./rehash.js'),
modules = require('./modules.js'),
- Identd = require('./identd.js');
+ Identd = require('./identd.js'),
+ ControlInterface = require('./controlinterface.js');
var logfile = fs.openSync(log_file_name, 'a'),
out;
- out = Array.prototype.join.apply(arguments, [' ']);
+ out = util.format.apply(util, arguments);
// Make sure we out somthing to log and we have an open file
if (!out || !logfile) return;
// Load any modules in the config
if (global.config.module_dir) {
(global.config.modules || []).forEach(function (module_name) {
- if (modules.load(global.config.module_dir + module_name + '.js')) {
+ if (modules.load(module_name)) {
console.log('Module ' + module_name + ' loaded successfuly');
} else {
console.log('Module ' + module_name + ' failed to load');
clients: Object.create(null),
addresses: Object.create(null),
+ // Local and foriegn port pairs for identd lookups
+ // {'65483_6667': client_obj, '54356_6697': client_obj}
+ port_pairs: {},
+
add: function (client) {
this.clients[client.hash] = client;
if (typeof this.addresses[client.real_address] === 'undefined') {
} else {
return 0;
}
+ },
+
+ broadcastKiwiCommand: function (command, data, callback) {
+ var clients = [];
+
+ // Get an array of clients for us to work with
+ for (var client in global.clients.clients) {
+ clients.push(global.clients.clients[client]);
+ }
+
+
+ // Sending of the command in batches
+ var sendCommandBatch = function (list) {
+ var batch_size = 100,
+ cutoff;
+
+ if (list.length >= batch_size) {
+ // If we have more clients than our batch size, call ourself with the next batch
+ setTimeout(function () {
+ sendCommandBatch(list.slice(batch_size));
+ }, 200);
+
+ cutoff = batch_size;
+
+ } else {
+ cutoff = list.length;
+ }
+
+ list.slice(0, cutoff).forEach(function (client) {
+ if (!client.disposed) {
+ client.sendKiwiCommand(command, data);
+ }
+ });
+
+ if (cutoff === list.length && typeof callback === 'function') {
+ callback();
+ }
+ };
+
+ sendCommandBatch(clients);
}
};
global.servers = {
servers: Object.create(null),
-
+
addConnection: function (connection) {
var host = connection.irc_host.hostname;
if (!this.servers[host]) {
}
this.servers[host].push(connection);
},
-
+
removeConnection: function (connection) {
var host = connection.irc_host.hostname
if (this.servers[host]) {
}
}
},
-
+
numOnHost: function (host) {
if (this.servers[host]) {
return this.servers[host].length;
+/**
+ * When a new config is loaded, send out an alert to the clients so
+ * so they can reload it
+ */
+config.on('loaded', function () {
+ global.clients.broadcastKiwiCommand('reconfig');
+});
+
+
/*
* Identd server
*/
if (global.config.identd && global.config.identd.enabled) {
- new Identd({
+ var identd_resolve_user = function(port_here, port_there) {
+ var key = port_here.toString() + '_' + port_there.toString();
+
+ if (typeof global.clients.port_pairs[key] == 'undefined') {
+ return;
+ }
+
+ return global.clients.port_pairs[key].username;
+ };
+
+ var identd_server = new Identd({
bind_addr: global.config.identd.address,
- bind_port: global.config.identd.port
- }).start();
+ bind_port: global.config.identd.port,
+ user_id: identd_resolve_user
+ });
+
+ identd_server.start();
}
});
+process.on('SIGUSR2', function() {
+ console.log('Connected clients: ' + _.size(global.clients.clients).toString());
+ console.log('Num. remote hosts: ' + _.size(global.clients.addresses).toString());
+});
/*
* Listen for runtime commands
*/
-
process.stdin.resume();
-process.stdin.on('data', function (buffered) {
- var data = buffered.toString().trim();
-
- switch (data) {
- case 'stats':
- console.log('Connected clients: ' + _.size(global.clients.clients).toString());
- console.log('Num. remote hosts: ' + _.size(global.clients.addresses).toString());
- break;
-
- case 'reconfig':
- if (config.loadConfig()) {
- console.log('New config file loaded');
- } else {
- console.log("No new config file was loaded");
- }
-
- break;
-
-
- case 'rehash':
- (function () {
- rehash.rehashAll();
- console.log('Rehashed');
- })();
-
- break;
-
- default:
- console.log('Unrecognised command: ' + data);
- }
-});
+new ControlInterface(process.stdin, process.stdout, {prompt: ''});