 04ee853cec
			
		
	
	04ee853cec
	
	
	
		
			
			Summary: Add the logger as soon as possible so that the log file will contain errors if the `ws` module cannot be loaded. Test Plan: Ran `./bin/aphlict debug` without having the `ws` module installed. Saw errors in the logs. Reviewers: epriestley, #blessed_reviewers Reviewed By: epriestley, #blessed_reviewers Subscribers: Korvin, epriestley Differential Revision: https://secure.phabricator.com/D11457
		
			
				
	
	
		
			136 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| var JX = require('./lib/javelin').JX;
 | |
| var http = require('http');
 | |
| var https = require('https');
 | |
| var util = require('util');
 | |
| var fs = require('fs');
 | |
| 
 | |
| function parse_command_line_arguments(argv) {
 | |
|   var config = {
 | |
|     'client-port': 22280,
 | |
|     'admin-port': 22281,
 | |
|     'client-host': '0.0.0.0',
 | |
|     'admin-host': '127.0.0.1',
 | |
|     log: '/var/log/aphlict.log',
 | |
|     'ssl-key': null,
 | |
|     'ssl-cert': null,
 | |
|     test: false
 | |
|   };
 | |
| 
 | |
|   for (var ii = 2; ii < argv.length; ii++) {
 | |
|     var arg = argv[ii];
 | |
|     var matches = arg.match(/^--([^=]+)=(.*)$/);
 | |
|     if (!matches) {
 | |
|       throw new Error('Unknown argument "' + arg + '"!');
 | |
|     }
 | |
|     if (!(matches[1] in config)) {
 | |
|       throw new Error('Unknown argument "' + matches[1] + '"!');
 | |
|     }
 | |
|     config[matches[1]] = matches[2];
 | |
|   }
 | |
| 
 | |
|   config['client-port'] = parseInt(config['client-port'], 10);
 | |
|   config['admin-port'] = parseInt(config['admin-port'], 10);
 | |
| 
 | |
|   return config;
 | |
| }
 | |
| 
 | |
| require('./lib/AphlictLog');
 | |
| 
 | |
| var debug = new JX.AphlictLog()
 | |
|   .addConsole(console);
 | |
| 
 | |
| var config = parse_command_line_arguments(process.argv);
 | |
| 
 | |
| function set_exit_code(code) {
 | |
|   process.on('exit', function() {
 | |
|     process.exit(code);
 | |
|   });
 | |
| }
 | |
| 
 | |
| process.on('uncaughtException', function(err) {
 | |
|   var context = null;
 | |
|   if (err.code == 'EACCES' && err.path == config.log) {
 | |
|     context = util.format(
 | |
|       'Unable to open logfile ("%s"). Check that permissions are set ' +
 | |
|       'correctly.',
 | |
|       err.path);
 | |
|   }
 | |
| 
 | |
|   var message = [
 | |
|     '\n<<< UNCAUGHT EXCEPTION! >>>',
 | |
|   ];
 | |
|   if (context) {
 | |
|     message.push(context);
 | |
|   }
 | |
|   message.push(err.stack);
 | |
| 
 | |
|   debug.log(message.join('\n\n'));
 | |
|   set_exit_code(1);
 | |
| });
 | |
| 
 | |
| // Add the logfile so we'll fail if we can't write to it.
 | |
| if (config.log) {
 | |
|   debug.addLog(config.log);
 | |
| }
 | |
| 
 | |
| try {
 | |
|   require('ws');
 | |
| } catch (ex) {
 | |
|   throw new Error(
 | |
|     'You need to install the Node.js "ws" module for websocket support. ' +
 | |
|     'See "Notifications User Guide: Setup and Configuration" in the ' +
 | |
|     'documentation for instructions. ' + ex.toString());
 | |
| }
 | |
| 
 | |
| // NOTE: Require these only after checking for the "ws" module, since they
 | |
| // depend on it.
 | |
| 
 | |
| require('./lib/AphlictAdminServer');
 | |
| require('./lib/AphlictClientServer');
 | |
| 
 | |
| var ssl_config = {
 | |
|   enabled: (config['ssl-key'] || config['ssl-cert'])
 | |
| };
 | |
| 
 | |
| // Load the SSL certificates (if any were provided) now, so that runs with
 | |
| // `--test` will see any errors.
 | |
| if (ssl_config.enabled) {
 | |
|   ssl_config.key = fs.readFileSync(config['ssl-key']);
 | |
|   ssl_config.cert = fs.readFileSync(config['ssl-cert']);
 | |
| }
 | |
| 
 | |
| // If we're just doing a configuration test, exit here before starting any
 | |
| // servers.
 | |
| if (config.test) {
 | |
|   debug.log('Configuration test OK.');
 | |
|   set_exit_code(0);
 | |
|   return;
 | |
| }
 | |
| 
 | |
| var server;
 | |
| if (ssl_config.enabled) {
 | |
|   server = https.createServer({
 | |
|     key: ssl_config.key,
 | |
|     cert: ssl_config.cert
 | |
|   }, function(req, res) {
 | |
|     res.writeHead(501);
 | |
|     res.end('HTTP/501 Use Websockets\n');
 | |
|   });
 | |
| } else {
 | |
|   server = http.createServer(function() {});
 | |
| }
 | |
| 
 | |
| var client_server = new JX.AphlictClientServer(server);
 | |
| var admin_server = new JX.AphlictAdminServer();
 | |
| 
 | |
| client_server.setLogger(debug);
 | |
| admin_server.setLogger(debug);
 | |
| admin_server.setClientServer(client_server);
 | |
| 
 | |
| client_server.listen(config['client-port'], config['client-host']);
 | |
| admin_server.listen(config['admin-port'], config['admin-host']);
 | |
| 
 | |
| debug.log('Started Server (PID %d)', process.pid);
 |