diff --git a/lib/config.coffee b/lib/config.coffee index f7a5be5..cddea7f 100644 --- a/lib/config.coffee +++ b/lib/config.coffee @@ -16,6 +16,7 @@ ### exports.DATABASE_NAME = 'genieacs' +exports.REDIS_DB = 0 exports.ACS_PORT = 7547 # CWMP port as assigned by IANA exports.ACS_HTTPS_PORT = 7548 exports.ACS_INTERFACE = '0.0.0.0' diff --git a/lib/cwmp.coffee b/lib/cwmp.coffee index df0dbac..de165c0 100644 --- a/lib/cwmp.coffee +++ b/lib/cwmp.coffee @@ -559,20 +559,24 @@ cluster = require 'cluster' numCPUs = require('os').cpus().length if cluster.isMaster - db.redisClient.flushdb() - cluster.on('listening', (worker, address) -> - util.log("Worker #{worker.process.pid} listening to #{address.address}:#{address.port}") - ) + db.connect((err) -> + throw err if err + db.redisClient.flushdb() + db.disconnect() + cluster.on('listening', (worker, address) -> + util.log("Worker #{worker.process.pid} listening to #{address.address}:#{address.port}") + ) - cluster.on('exit', (worker, code, signal) -> - util.log("Worker #{worker.process.pid} died (#{worker.process.exitCode})") - setTimeout(()-> + cluster.on('exit', (worker, code, signal) -> + util.log("Worker #{worker.process.pid} died (#{worker.process.exitCode})") + setTimeout(()-> + cluster.fork() + , config.WORKER_RESPAWN_TIME) + ) + + for [1 .. numCPUs] cluster.fork() - , config.WORKER_RESPAWN_TIME) ) - - for [1 .. numCPUs] - cluster.fork() else options = { key: fs.readFileSync('../config/httpscert.key'), @@ -582,8 +586,8 @@ else httpServer = http.createServer(listener) httpsServer = https.createServer(options, listener) - # wait until DB connections are established - setTimeout(() -> + db.connect((err) -> + throw err if err httpServer.listen(config.ACS_PORT, config.ACS_INTERFACE) httpsServer.listen(config.ACS_HTTPS_PORT, config.ACS_HTTPS_INTERFACE) - , 1000) + ) diff --git a/lib/db.coffee b/lib/db.coffee index 1b3d20a..c76835f 100644 --- a/lib/db.coffee +++ b/lib/db.coffee @@ -17,43 +17,71 @@ config = require './config' mongodb = require 'mongodb' -redisClient = require('redis').createClient(config.REDIS_SOCKET) +redis = require('redis') parameters = require './parameters' +redisClient = null tasksCollection = null devicesCollection = null presetsCollection = null objectsCollection = null -mongodb.MongoClient.connect("mongodb://#{config.MONGODB_SOCKET}/#{config.DATABASE_NAME}", config.MONGODB_OPTIONS, (err, db) -> - exports.mongoDb = db - db.collection('tasks', (err, collection) -> - throw new Error(err) if err? - exports.tasksCollection = tasksCollection = collection - collection.ensureIndex({device: 1, timestamp: 1}, (err) -> + +connect = (callback) -> + callbackCounter = 6 + mongodb.MongoClient.connect("mongodb://#{config.MONGODB_SOCKET}/#{config.DATABASE_NAME}", config.MONGODB_OPTIONS, (err, db) -> + return callback(err) if err + exports.mongoDb = db + db.collection('tasks', (err, collection) -> + exports.tasksCollection = tasksCollection = collection + collection?.ensureIndex({device: 1, timestamp: 1}, (err) -> + ) + + if --callbackCounter == 0 or err + callbackCounter = 0 + return callback(err) + ) + + db.collection('devices', (err, collection) -> + exports.devicesCollection = devicesCollection = collection + if --callbackCounter == 0 or err + callbackCounter = 0 + return callback(err) + ) + + db.collection('presets', (err, collection) -> + exports.presetsCollection = presetsCollection = collection + if --callbackCounter == 0 or err + callbackCounter = 0 + return callback(err) + ) + + db.collection('objects', (err, collection) -> + exports.objectsCollection = objectsCollection = collection + if --callbackCounter == 0 or err + callbackCounter = 0 + return callback(err) + ) + + db.collection('fs.files', (err, collection) -> + exports.filesCollection = filesCollection = collection + if --callbackCounter == 0 or err + callbackCounter = 0 + return callback(err) + ) + + exports.redisClient = redisClient = redis.createClient(config.REDIS_SOCKET) + redisClient.select(config.REDIS_DB, (err) -> + if --callbackCounter == 0 or err + callbackCounter = 0 + return callback(err) ) ) - db.collection('devices', (err, collection) -> - throw new Error(err) if err? - exports.devicesCollection = devicesCollection = collection - ) - db.collection('presets', (err, collection) -> - throw new Error(err) if err? - exports.presetsCollection = presetsCollection = collection - ) - - db.collection('objects', (err, collection) -> - throw new Error(err) if err? - exports.objectsCollection = objectsCollection = collection - ) - - db.collection('fs.files', (err, collection) -> - throw new Error(err) if err? - exports.filesCollection = filesCollection = collection - ) -) +disconnect = () -> + exports.mongoDb.close() + redisClient.quit() getTask = (taskId, callback) -> @@ -166,7 +194,8 @@ getPresetsObjectsAliases = (callback) -> ) -exports.redisClient = redisClient exports.getTask = getTask exports.getPresetsObjectsAliases = getPresetsObjectsAliases exports.getAliases = getAliases +exports.connect = connect +exports.disconnect = disconnect diff --git a/lib/fs.coffee b/lib/fs.coffee index fba17fe..a377f51 100644 --- a/lib/fs.coffee +++ b/lib/fs.coffee @@ -28,10 +28,6 @@ mongodb = require 'mongodb' querystring = require 'querystring' db = null -mongodb.MongoClient.connect("mongodb://#{config.MONGODB_SOCKET}/#{config.DATABASE_NAME}", config.MONGODB_OPTIONS, (err, _db) -> - db = _db -) - cluster = require 'cluster' numCPUs = require('os').cpus().length @@ -70,4 +66,8 @@ else response.end('405 Method Not Allowed') ) - server.listen config.FILES_PORT, config.FILES_INTERFACE + mongodb.MongoClient.connect("mongodb://#{config.MONGODB_SOCKET}/#{config.DATABASE_NAME}", config.MONGODB_OPTIONS, (err, _db) -> + throw err if err + db = _db + server.listen config.FILES_PORT, config.FILES_INTERFACE + ) diff --git a/lib/nbi.coffee b/lib/nbi.coffee index 91451b8..3b897aa 100644 --- a/lib/nbi.coffee +++ b/lib/nbi.coffee @@ -398,4 +398,7 @@ else response.writeHead 404 response.end('404 Not Found') - server.listen config.API_PORT, config.API_INTERFACE + db.connect((err) -> + throw err if err + server.listen config.API_PORT, config.API_INTERFACE + )