Config file can now be in /etc/xo-server & basic help message.
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,2 +1,3 @@
|
|||||||
/node_modules/
|
/node_modules/
|
||||||
npm-debug.log
|
npm-debug.log
|
||||||
|
.xo-server.*
|
||||||
|
|||||||
21
package.json
21
package.json
@@ -23,31 +23,36 @@
|
|||||||
"url": "git://github.com/vatesfr/xo-server.git"
|
"url": "git://github.com/vatesfr/xo-server.git"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"app-conf": "^0.1.3",
|
||||||
"backoff": "~2.4.0",
|
"backoff": "~2.4.0",
|
||||||
"bluebird": "^2.2.2",
|
"bluebird": "^2.2.2",
|
||||||
|
"chalk": "^0.5.1",
|
||||||
"coffee-script": "~1.7.1",
|
"coffee-script": "~1.7.1",
|
||||||
"connect": "^3.1.0",
|
"compiled-accessors": "^0.2.0",
|
||||||
"event-to-promise": "^0.3.0",
|
"connect": "^2.25.5",
|
||||||
"exec-promise": "^0.3.0",
|
"event-to-promise": "^0.3.1",
|
||||||
|
"exec-promise": "^0.4.0",
|
||||||
"extendable": "~0.0.6",
|
"extendable": "~0.0.6",
|
||||||
"fibers": "~1.0.1",
|
"fibers": "~1.0.1",
|
||||||
"hashy": "~0.3.6",
|
"hashy": "~0.3.6",
|
||||||
"http-server-plus": "^0.2.3",
|
"http-server-plus": "^0.2.3",
|
||||||
"js-yaml": "~3.1.0",
|
"js-yaml": "~3.1.0",
|
||||||
|
"lodash.isfunction": "^2.4.1",
|
||||||
|
"lodash.map": "^2.4.1",
|
||||||
"nconf": "~0.6.9",
|
"nconf": "~0.6.9",
|
||||||
"require-tree": "~0.3.3",
|
"require-tree": "~0.3.3",
|
||||||
"schema-inspector": "^1.4.5",
|
"schema-inspector": "^1.4.8",
|
||||||
"serve-static": "^1.4.0",
|
"serve-static": "^1.5.1",
|
||||||
"then-redis": "~0.3.12",
|
"then-redis": "~0.3.12",
|
||||||
"underscore": "~1.6.0",
|
"underscore": "~1.6.0",
|
||||||
"ws": "~0.4.31",
|
"ws": "~0.4.32",
|
||||||
"xml2js": "~0.4.4",
|
"xml2js": "~0.4.4",
|
||||||
"xmlrpc": "~1.2.0"
|
"xmlrpc": "~1.2.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"chai": "~1.9.1",
|
"chai": "~1.9.1",
|
||||||
"glob": "~4.0.4",
|
"glob": "~4.0.5",
|
||||||
"mocha": "^1.21.0",
|
"mocha": "^1.21.4",
|
||||||
"node-inspector": "^0.7.4",
|
"node-inspector": "^0.7.4",
|
||||||
"sinon": "^1.10.3"
|
"sinon": "^1.10.3"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
# Note: Relative paths will be resolved from XO-Server's directory.
|
# Example XO-Server configuration.
|
||||||
|
|
||||||
|
# This file is automatically looking for at the following places:
|
||||||
|
# - `./.xo-server.yaml` up to `/.xo-server.yaml`
|
||||||
|
# - `$HOME/.config/xo-server/config.yaml`
|
||||||
|
# - `/etc/xo-server/config.yaml`
|
||||||
|
#
|
||||||
|
# The first entries have priority.
|
||||||
|
|
||||||
|
# Note: paths are relative to the configuration file.
|
||||||
|
|
||||||
#=====================================================================
|
#=====================================================================
|
||||||
|
|
||||||
@@ -6,15 +6,16 @@ $fs = require 'fs'
|
|||||||
# Low level tools.
|
# Low level tools.
|
||||||
$_ = require 'underscore'
|
$_ = require 'underscore'
|
||||||
|
|
||||||
|
$appConf = require 'app-conf'
|
||||||
|
|
||||||
|
$chalk = require 'chalk'
|
||||||
|
|
||||||
# HTTP(s) middleware framework.
|
# HTTP(s) middleware framework.
|
||||||
$connect = require 'connect'
|
$connect = require 'connect'
|
||||||
$serveStatic = require 'serve-static'
|
$serveStatic = require 'serve-static'
|
||||||
|
|
||||||
$eventToPromise = require 'event-to-promise'
|
$eventToPromise = require 'event-to-promise'
|
||||||
|
|
||||||
# Configuration handling.
|
|
||||||
$nconf = require 'nconf'
|
|
||||||
|
|
||||||
$Promise = require 'bluebird'
|
$Promise = require 'bluebird'
|
||||||
$Promise.longStackTraces()
|
$Promise.longStackTraces()
|
||||||
|
|
||||||
@@ -33,6 +34,8 @@ $XO = require './xo'
|
|||||||
# Helpers for dealing with fibers.
|
# Helpers for dealing with fibers.
|
||||||
{$fiberize, $promisify, $waitEvent, $wait} = require './fibers-utils'
|
{$fiberize, $promisify, $waitEvent, $wait} = require './fibers-utils'
|
||||||
|
|
||||||
|
{$fileExists, $wrap} = require './utils'
|
||||||
|
|
||||||
# HTTP/HTTPS server which can listen on multiple ports.
|
# HTTP/HTTPS server which can listen on multiple ports.
|
||||||
$WebServer = require 'http-server-plus'
|
$WebServer = require 'http-server-plus'
|
||||||
|
|
||||||
@@ -89,48 +92,36 @@ $handleJsonRpcCall = (api, session, encodedRequest) ->
|
|||||||
#=====================================================================
|
#=====================================================================
|
||||||
|
|
||||||
# Main.
|
# Main.
|
||||||
module.exports = $promisify (args) ->
|
exports = module.exports = $promisify (args) ->
|
||||||
|
return exports.help() unless (
|
||||||
|
(args.indexOf '--help') is -1 and
|
||||||
|
(args.indexOf '-h') is -1
|
||||||
|
)
|
||||||
|
|
||||||
# Relative paths in the configuration are relative to this
|
# Default config.
|
||||||
# directory's parent.
|
opts = {
|
||||||
process.chdir "#{__dirname}/.."
|
|
||||||
|
|
||||||
# Loads the environment.
|
|
||||||
$nconf.env()
|
|
||||||
|
|
||||||
# Parses process' arguments.
|
|
||||||
$nconf.argv()
|
|
||||||
|
|
||||||
# Loads the configuration files.
|
|
||||||
format =
|
|
||||||
stringify: $YAML.safeDump
|
|
||||||
parse: $YAML.safeLoad
|
|
||||||
$nconf.use 'file', {
|
|
||||||
file: "#{__dirname}/../config/local.yaml"
|
|
||||||
format
|
|
||||||
}
|
|
||||||
|
|
||||||
# Defines defaults configuration.
|
|
||||||
$nconf.defaults {
|
|
||||||
http: {
|
http: {
|
||||||
listen: [
|
listen: [
|
||||||
port: 80
|
port: 80
|
||||||
]
|
]
|
||||||
mounts: []
|
mounts: {}
|
||||||
}
|
}
|
||||||
redis: {
|
redis: {
|
||||||
# Default values are handled by `redis`.
|
# Default values are handled by `redis`.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Loads config files.
|
||||||
|
opts = $wait $appConf.load 'xo-server', opts
|
||||||
|
|
||||||
# Prints a message if deprecated entries are specified.
|
# Prints a message if deprecated entries are specified.
|
||||||
for entry in ['users', 'servers']
|
for entry in ['users', 'servers']
|
||||||
if $nconf.get entry
|
if entry of opts
|
||||||
console.warn "[Warn] `#{entry}` configuration is deprecated."
|
console.warn "[Warn] `#{entry}` configuration is deprecated."
|
||||||
|
|
||||||
# Creates the web server according to the configuration.
|
# Creates the web server according to the configuration.
|
||||||
webServer = new $WebServer()
|
webServer = new $WebServer()
|
||||||
$wait $Promise.map ($nconf.get 'http:listen'), (options) ->
|
$wait $Promise.map opts.http.listen, (options) ->
|
||||||
# Reads certificate and key if necessary.
|
# Reads certificate and key if necessary.
|
||||||
if options.certificate? and options.key?
|
if options.certificate? and options.key?
|
||||||
options.certificate = $wait $readFile options.certificate
|
options.certificate = $wait $readFile options.certificate
|
||||||
@@ -151,10 +142,8 @@ module.exports = $promisify (args) ->
|
|||||||
|
|
||||||
# Now the web server is listening, drop privileges.
|
# Now the web server is listening, drop privileges.
|
||||||
try
|
try
|
||||||
if (group = $nconf.get 'group')?
|
process.setgid opts.group if opts.group?
|
||||||
process.setgid group
|
process.setuid opts.user if opts.user?
|
||||||
if (user = $nconf.get 'user')?
|
|
||||||
process.setuid user
|
|
||||||
catch error
|
catch error
|
||||||
console.warn "[WARN] Failed to change the user or group: #{error.message}"
|
console.warn "[WARN] Failed to change the user or group: #{error.message}"
|
||||||
|
|
||||||
@@ -170,13 +159,13 @@ module.exports = $promisify (args) ->
|
|||||||
# Starts it.
|
# Starts it.
|
||||||
xo.start {
|
xo.start {
|
||||||
redis: {
|
redis: {
|
||||||
uri: $nconf.get 'redis:uri'
|
uri: opts.redis?.uri
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Static file serving (e.g. for XO-Web).
|
# Static file serving (e.g. for XO-Web).
|
||||||
connect = $connect()
|
connect = $connect()
|
||||||
for urlPath, filePaths of $nconf.get 'http:mounts'
|
for urlPath, filePaths of opts.http.mounts
|
||||||
filePaths = [filePaths] unless $_.isArray filePaths
|
filePaths = [filePaths] unless $_.isArray filePaths
|
||||||
for filePath in filePaths
|
for filePath in filePaths
|
||||||
connect.use urlPath, $serveStatic filePath
|
connect.use urlPath, $serveStatic filePath
|
||||||
@@ -228,3 +217,17 @@ module.exports = $promisify (args) ->
|
|||||||
console.log "[INFO] Default user: “#{email}” with password “#{password}”"
|
console.log "[INFO] Default user: “#{email}” with password “#{password}”"
|
||||||
|
|
||||||
return $eventToPromise webServer, 'close'
|
return $eventToPromise webServer, 'close'
|
||||||
|
|
||||||
|
exports.help = do (pkg = require '../package') ->
|
||||||
|
name = $chalk.bold pkg.name
|
||||||
|
|
||||||
|
return $wrap '''
|
||||||
|
Usage: $name
|
||||||
|
|
||||||
|
$name v$version
|
||||||
|
'''.replace /<([^>]+)>|\$(\w+)/g, (_, arg, key) ->
|
||||||
|
return '<'+ ($chalk.yellow arg) +'>' if arg
|
||||||
|
|
||||||
|
return name if key is 'name'
|
||||||
|
|
||||||
|
return pkg[key]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
$done = {}
|
$done = exports.$done = {}
|
||||||
|
|
||||||
# Similar to `$_.each()` but can be interrupted by returning the
|
# Similar to `$_.each()` but can be interrupted by returning the
|
||||||
# special value `done` provided as the forth argument.
|
# special value `done` provided as the forth argument.
|
||||||
@@ -71,3 +71,18 @@ exports.$mapInPlace = (col, iterator, ctx) ->
|
|||||||
|
|
||||||
# The collection is returned.
|
# The collection is returned.
|
||||||
col
|
col
|
||||||
|
|
||||||
|
# Wraps a value in a function.
|
||||||
|
exports.$wrap = (val) -> -> val
|
||||||
|
|
||||||
|
#=====================================================================
|
||||||
|
|
||||||
|
$fs = require 'fs'
|
||||||
|
|
||||||
|
$Promise = require 'bluebird'
|
||||||
|
|
||||||
|
exports.$fileExists = (path) ->
|
||||||
|
return new Promise (resolve) ->
|
||||||
|
$fs.exists path, resolve
|
||||||
|
|
||||||
|
exports.$readFile = $Promise.promisify $fs.readFile
|
||||||
|
|||||||
Reference in New Issue
Block a user