diff --git a/lib/server.js b/lib/server.js index fa97e879..bb0ea1f8 100644 --- a/lib/server.js +++ b/lib/server.js @@ -11,6 +11,7 @@ config = require(DIR_SERVER + 'config'), prefixer = require(DIR_SERVER + 'prefixer'), express = require('express'), + freeport = require('freeport'), tryRequire = require('tryrequire'), logger = tryRequire('morgan'), io = require('socket.io'); @@ -21,6 +22,7 @@ */ module.exports = function(options) { var server, + getPort, onError, port = process.env.PORT || /* c9 */ process.env.VCAP_APP_PORT || /* cloudfoundry */ @@ -44,15 +46,25 @@ }) })); - if (port < 1 || port > 65535) - exit('cloudcmd --port: %s', 'port number could be 1..65535'); + if (port < 0 || port > 65535) + exit('cloudcmd --port: %s', 'port number could be 1..65535, 0 means any available port'); - server.on('error', function(error) { + getPort = function(fn) { + port ? fn(null, port) : freeport(fn); + }; + + onError = function(error) { exit('cloudcmd --port: %s', error.message); + }; + + getPort(function(error, port) { + if (error) + return onError(error); + + server.listen(port, ip); + server.on('error', onError); + + console.log('url: http://%s:%d', config('ip') || 'localhost', port); }); - - server.listen(port, ip); - - console.log('url: http://%s:%d', config('ip') || 'localhost', port); }; })(); diff --git a/package.json b/package.json index de7df9a4..180e143a 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,6 @@ "docker": "npm-run-all docker:pull:node docker:build docker:push", "docker:alpine": "npm-run-all docker:pull:alpine docker:build:alpine docker:tag:alpine docker:push:alpine docker:push:alpine:latest", "docker:tag:alpine": "docker tag coderaiser/cloudcmd:`version`-alpine coderaiser/cloudcmd:latest-alpine", - "docker:pull:alpine": "docker pull mhart/alpine-node", "docker:rm": "docker rmi coderaiser/cloudcmd:`version` || true", "docker:rm:alpine": "docker rmi coderaiser/cloudcmd:`version`-alpine || true", "coverage": "nyc npm test", @@ -74,6 +73,7 @@ "files-io": "~1.2.0", "flop": "~1.4.0", "format-io": "~0.9.6", + "freeport": "~1.0.5", "http-auth": "~2.2.3", "ishtar": "~1.3.0", "jaguar": "~1.1.0",