From a38c317ecdb9266731708c397f0c017087a5d99b Mon Sep 17 00:00:00 2001 From: Jonathan Rainville Date: Thu, 23 Aug 2018 14:14:10 -0400 Subject: [PATCH 1/3] check port for webserver, if in use ++ port --- lib/modules/webserver/index.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/modules/webserver/index.js b/lib/modules/webserver/index.js index cfd5d7baf..a00149196 100644 --- a/lib/modules/webserver/index.js +++ b/lib/modules/webserver/index.js @@ -17,14 +17,20 @@ class WebServer { this.port = options.port || this.webServerConfig.port; this.events.emit("status", __("Starting Server")); - this.server = new Server({host: this.host, port: this.port}); - this.setServiceCheck(); - this.listenToCommands(); - this.registerConsoleCommands(); + utils.pingEndpoint(this.host, this.port, 'http', 'http', '', (err) => { + if (!err) { // Port already in use + this.logger.warn(__('Webserver already running on port {{oldPort}}. Trying to connect on {{newPort}}', + {oldPort: this.port, newPort: this.port + 1})); + this.port++; + } + this.server = new Server({host: this.host, port: this.port}); - let self = this; - this.server.start((_err, message) => self.logger.info(message)); + this.setServiceCheck(); + this.listenToCommands(); + this.registerConsoleCommands(); + this.server.start((_err, message) => this.logger.info(message)); + }); } setServiceCheck() { From 7e59b6f0d05d8e15acb7e09519193762c70462b1 Mon Sep 17 00:00:00 2001 From: Jonathan Rainville Date: Thu, 23 Aug 2018 14:28:44 -0400 Subject: [PATCH 2/3] increment port multiple times if multiple embarks --- lib/modules/webserver/index.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/modules/webserver/index.js b/lib/modules/webserver/index.js index a00149196..8fd62d734 100644 --- a/lib/modules/webserver/index.js +++ b/lib/modules/webserver/index.js @@ -18,12 +18,7 @@ class WebServer { this.events.emit("status", __("Starting Server")); - utils.pingEndpoint(this.host, this.port, 'http', 'http', '', (err) => { - if (!err) { // Port already in use - this.logger.warn(__('Webserver already running on port {{oldPort}}. Trying to connect on {{newPort}}', - {oldPort: this.port, newPort: this.port + 1})); - this.port++; - } + this.testPort(() => { this.server = new Server({host: this.host, port: this.port}); this.setServiceCheck(); @@ -33,6 +28,18 @@ class WebServer { }); } + testPort(done) { + utils.pingEndpoint(this.host, this.port, 'http', 'http', '', (err) => { + if (err) { // Port is ok + return done(); + } + this.logger.warn(__('Webserver already running on port {{oldPort}}. Trying to connect on {{newPort}}', + {oldPort: this.port, newPort: this.port + 1})); + this.port++; + this.testPort(done); + }); + } + setServiceCheck() { let url = 'http://' + canonicalHost(this.host) + ':' + this.port; From b9c65f2d5882ad7cbd29c47ef3a599c29a1cd322 Mon Sep 17 00:00:00 2001 From: Jonathan Rainville Date: Thu, 23 Aug 2018 15:11:43 -0400 Subject: [PATCH 3/3] use listen(0) to find a port --- lib/modules/webserver/index.js | 21 ++++++++++++--------- lib/modules/webserver/server.js | 14 ++++++++------ 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/lib/modules/webserver/index.js b/lib/modules/webserver/index.js index 8fd62d734..a0b948502 100644 --- a/lib/modules/webserver/index.js +++ b/lib/modules/webserver/index.js @@ -18,13 +18,15 @@ class WebServer { this.events.emit("status", __("Starting Server")); + this.server = new Server({host: this.host, port: this.port}); this.testPort(() => { - this.server = new Server({host: this.host, port: this.port}); - - this.setServiceCheck(); this.listenToCommands(); this.registerConsoleCommands(); - this.server.start((_err, message) => this.logger.info(message)); + this.server.start((_err, message, port) => { + this.logger.info(message); + this.port = port; + this.setServiceCheck(); + }); }); } @@ -33,17 +35,18 @@ class WebServer { if (err) { // Port is ok return done(); } - this.logger.warn(__('Webserver already running on port {{oldPort}}. Trying to connect on {{newPort}}', - {oldPort: this.port, newPort: this.port + 1})); - this.port++; - this.testPort(done); + this.logger.warn(__('Webserver already running on port %s. Assigning an available port', this.port)); + this.port = 0; + this.server.port = 0; + done(); }); } setServiceCheck() { - let url = 'http://' + canonicalHost(this.host) + ':' + this.port; + const self = this; this.events.request("services:register", 'Webserver', function (cb) { + let url = 'http://' + canonicalHost(self.host) + ':' + self.port; utils.checkIsAvailable(url, function (available) { let devServer = __('Webserver') + ' (' + url + ')'; let serverStatus = (available ? 'on' : 'off'); diff --git a/lib/modules/webserver/server.js b/lib/modules/webserver/server.js index 40356be6b..340f5307c 100644 --- a/lib/modules/webserver/server.js +++ b/lib/modules/webserver/server.js @@ -24,12 +24,14 @@ class Server { serve(req, res, finalhandler(req, res)); }).withShutdown(); - let message = __("webserver available at") + - " " + - ("http://" + canonicalHost(this.hostname) + - ":" + this.port).bold.underline.green; - this.server.listen(this.port, this.hostname); - callback(null, message); + + this.server.listen(this.port, this.hostname, () => { + this.port = this.server.address().port; + callback(null, __("webserver available at") + + " " + + ("http://" + canonicalHost(this.hostname) + + ":" + this.port).bold.underline.green, this.port); + }); } stop(callback) {