Server modules location in config. Control module included
authorDarren <darren@darrenwhitlen.com>
Fri, 30 Nov 2012 16:19:42 +0000 (16:19 +0000)
committerDarren <darren@darrenwhitlen.com>
Fri, 30 Nov 2012 16:19:42 +0000 (16:19 +0000)
config.example.js
server/kiwi.js
server_modules/control.js [new file with mode: 0644]

index e17c8f39498e6865ee1a76b13da1f9ff6702fb91..08d4877aa26f00672054b87267a6b1a18af26692 100644 (file)
@@ -63,7 +63,7 @@ conf.cap_options = [];
 
 
 // Directory to find the server modules
-conf.module_dir = "./kiwi_modules/";
+conf.module_dir = "../server_modules/";
 
 // Which modules to load
 conf.modules = [];
index 1c7520d33cae028a249d5b17ffa918476248460b..36c2c5bd1de5cc5cad4d453990d6f075055519b9 100755 (executable)
@@ -63,14 +63,15 @@ global.modules = new modules.Publisher();
 modules.registerPublisher(global.modules);
 
 // Load any modules in the config
-(global.config.modules || []).forEach(function (module_name) {
-    if (modules.load('../server_modules/' + module_name + '.js')) {
-        console.log('Module ' + module_name + ' loaded successfuly');
-    } else {
-        console.log('Module ' + module_name + ' failed to load');
-    }
-});
-
+if (global.config.module_dir) {
+    (global.config.modules || []).forEach(function (module_name) {
+        if (modules.load(global.config.module_dir + module_name + '.js')) {
+            console.log('Module ' + module_name + ' loaded successfuly');
+        } else {
+            console.log('Module ' + module_name + ' failed to load');
+        }
+    });
+}
 
 
 
diff --git a/server_modules/control.js b/server_modules/control.js
new file mode 100644 (file)
index 0000000..ac1a3e7
--- /dev/null
@@ -0,0 +1,106 @@
+/**\r
+ * Server control via TCP socket\r
+ *\r
+ * Listens on localhost:8888 by default\r
+ */\r
+\r
+var net         = require('net'),\r
+    kiwiModules = require('../server/modules'),\r
+    rehash      = require('../server/rehash.js'),\r
+    config      = require('../server/configuration.js'),\r
+    _           = require('lodash');\r
+\r
+var module = new kiwiModules.Module('Control');\r
+\r
+\r
+function SocketClient (socket) {\r
+    this.socket = socket;\r
+\r
+    this.remoteAddress = this.socket.remoteAddress;\r
+    console.log('Control connection from ' + this.socket.remoteAddress + ' opened');\r
+\r
+    this.bindEvents();\r
+\r
+    socket.write("\nHello, you are connected to the Kiwi server :)\n\n");\r
+    this.displayPrompt();\r
+}\r
+\r
+SocketClient.prototype.bindEvents = function() {\r
+    var that = this;\r
+\r
+    this.socket.on('data', function() { that.onData.apply(that, arguments); });\r
+    this.socket.on('close', function() { that.onClose.apply(that, arguments); });\r
+};\r
+SocketClient.prototype.unbindEvents = function() {\r
+    this.socket.removeAllListeners();\r
+};\r
+\r
+\r
+\r
+SocketClient.prototype.write = function(data, append) {\r
+    if (typeof append === 'undefined') append = '\n';\r
+    this.socket.write(data + append);\r
+};\r
+SocketClient.prototype.displayPrompt = function(prompt) {\r
+    prompt = prompt || 'Kiwi > ';\r
+    this.write(prompt, '');\r
+};\r
+\r
+\r
+\r
+SocketClient.prototype.onData = function(data) {\r
+    data = data.toString().trim();\r
+\r
+    try {\r
+        switch (data) {\r
+            case 'modules':\r
+                this.write('Loaded modules: ' + Object.keys(kiwiModules.getRegisteredModules()).join(', '));\r
+                break;\r
+\r
+            case 'stats':\r
+                this.write('Connected clients: ' + _.size(global.clients.clients).toString());\r
+                this.write('Num. remote hosts: ' + _.size(global.clients.addresses).toString());\r
+                break;\r
+\r
+            case 'rehash':\r
+                rehash.rehashAll();\r
+                this.write('Rehashed');\r
+                break;\r
+\r
+            case 'reconfig':\r
+                if (config.loadConfig()) {\r
+                    this.write('New config file loaded');\r
+                } else {\r
+                    this.write("No new config file was loaded");\r
+                }\r
+                break;\r
+\r
+            case 'exit':\r
+            case 'quit':\r
+                this.socket.destroy();\r
+                break;\r
+\r
+            default:\r
+                this.write('Unrecognised command: ' + data);\r
+        }\r
+    } catch (err) {\r
+        console.log('[Control error] ' + err);\r
+        this.write('An error occured. Check the Kiwi server log for more details');\r
+    }\r
+\r
+    this.displayPrompt();\r
+};\r
+\r
+\r
+SocketClient.prototype.onClose = function() {\r
+    this.unbindEvents();\r
+    console.log('Control connection from ' + this.remoteAddress + ' closed');\r
+};\r
+\r
+\r
+\r
+\r
+var server = net.createServer(function (socket) {\r
+    new SocketClient(socket);\r
+});\r
+server.listen(8888);
\ No newline at end of file