'use strict' require('es6-promise').polyfill() var http = require('http') var https = require('https') var express = require('express') var LamassuConfig = require('lamassu-config') var routes = require('./routes') var plugins = require('./plugins') var db = require('./postgresql_interface') var logger = require('./logger') module.exports = function (options) { var app = express() var connectionString var server var lamassuConfig connectionString = options.postgres || 'postgres://lamassu:lamassu@localhost/lamassu' lamassuConfig = new LamassuConfig(connectionString) db.init(connectionString) plugins.init(db) lamassuConfig.load(function (err, config) { if (err) { logger.error('Loading config failed') throw err } plugins.configure(config) plugins.startPolling() plugins.startCheckingNotification() }) lamassuConfig.on('configUpdate', function () { lamassuConfig.load(function (err, config) { if (err) { return logger.error('Error while reloading config') } plugins.configure(config) logger.info('Config reloaded') }) }) app.use(express.bodyParser()) var reloadConfigMiddleware = function (req, res, next) { lamassuConfig.load(function (err, config) { if (err) { logger.error('Error while reloading config') return next(err) } plugins.configure(config) next() }) } var authMiddleware if (options.https) { var serverOptions = { key: options.https.key, cert: options.https.cert, requestCert: true, secureProtocol: 'TLSv1_method', ciphers: 'AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH', honorCipherOrder: true } server = https.createServer(serverOptions, app) authMiddleware = function (req, res, next) { lamassuConfig.isAuthorized(routes.getFingerprint(req), function (err, device) { if (err) { res.json({err: 'Internal Server Error'}) return next(err) } if (!device) { res.json(404, {err: 'Not Found'}) return next(new Error('Device is unpaired')) } next() }) } } else { server = http.createServer(app) authMiddleware = function (req, res, next) { req.device = {} return next() } } if (options.mock) logger.info('In mock mode') var localApp = express() localApp.use(express.bodyParser()) var localServer = http.createServer(localApp) var localPort = 7070 routes.init({ app: app, localApp: localApp, lamassuConfig: lamassuConfig, plugins: plugins, authMiddleware: authMiddleware, reloadConfigMiddleware: reloadConfigMiddleware, mock: options.mock }) localServer.listen(7070, function () { console.log('lamassu-server is listening on local port %d', localPort) }) return server }