From 20b03b361ef75aad4401f3ba1f137c4892e69a96 Mon Sep 17 00:00:00 2001 From: Rob Humphris Date: Tue, 19 Apr 2016 11:35:46 +0100 Subject: [PATCH 1/7] Quick changes to get this to work with newer library versions. --- .gitignore | 3 ++ README.md | 5 ++ acra_server.properties | 4 +- appAcra.js | 104 +++++++++++++++++++++++-------------- logger.js | 91 ++++++++++++++++---------------- package.json | 35 ++++++++----- properties.js | 114 ++++++++++++++++++----------------------- public/favicon.ico | Bin 0 -> 1406 bytes 8 files changed, 195 insertions(+), 161 deletions(-) create mode 100644 .gitignore create mode 100644 public/favicon.ico diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2ef57ac --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +npm-debug.log +node_modules +.idea \ No newline at end of file diff --git a/README.md b/README.md index 6f29856..dc92ab2 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,11 @@ Server [ACRA](http://acra.ch/) for [Node.js](http://nodejs.org/) with data base Save all the crash reports in your own server. +### version 0.0.3 +* Updated to work with Express 4.x +* Updated to work with newer MongoDB + + ### version 0.0.3 * Statistics by android version. * Statistics by date error. diff --git a/acra_server.properties b/acra_server.properties index 0f8a8c0..f5ff3e2 100644 --- a/acra_server.properties +++ b/acra_server.properties @@ -20,12 +20,12 @@ name_database = acraloggerdb # CONFIGURATION MAIL # yes or no if want send email if acra error recive -send_mail = yes +send_mail = no # config connection email server user_mail= your_email@gmail.com password_mail = password_mail_gmail -host =smtp.gmail.com +host = smtp.gmail.com ssl = true # config email diff --git a/appAcra.js b/appAcra.js index f58597f..cce0e0a 100644 --- a/appAcra.js +++ b/appAcra.js @@ -1,55 +1,83 @@ var express = require('express'); var colors = require('colors'); var prop = require('./properties.js'); -var logger = require('./logger'); +var logger = require('morgan'); +var acraLogger = require('./logger.js'); +var bodyParser = require('body-parser'); +var cookieParser = require('cookie-parser') +var favicon = require('serve-favicon'); +var session = require('express-session'); +var basicAuth = require('basic-auth'); +//function control errors +function clientErrorHandler(err, req, res, next) { + console.log('client error handler found in ip:'+req.ip, err); + res.status(500); + res.render('error', {locals: {"error":err} }); +} var app = express(); - -app.configure(function () { - app.use(express.logger('default')); /* 'default', 'short', 'tiny', 'dev' */ - app.use(express.bodyParser()); -}); - app.use(express.static(__dirname + '/public')); -app.use(express.favicon()); -app.use(express.cookieParser()); -app.use(express.cookieSession({ - key:prop.key, - secret :prop.secret, - cookie:{ path: '/', httpOnly: true, maxAge: null } -})); - +app.use(favicon(__dirname + '/public/favicon.ico')); +app.use(cookieParser()); app.use(clientErrorHandler); -app.use( express.bodyParser()); app.set('views', __dirname + '/views'); app.set('view engine', 'ejs'); -app.use(app.router); +app.use(logger('dev')); +app.use(bodyParser.json()); +function auth (req, res, next) { + function unauthorized(res) { + res.set('WWW-Authenticate', 'Basic realm=Authorization Required'); + return res.send(401); + }; + var user = basicAuth(req); -//function control errors -function clientErrorHandler(err, req, res, next) { - console.log('client error handler found in ip:'+req.ip, err); - res.status(500); - res.render('error', {locals: {"error":err} }); -} + if (!user || !user.name || !user.pass) { + return unauthorized(res); + }; + + if (user.name === prop.username && user.pass === prop.password) { + return next(); + } else { + return unauthorized(res); + }; +}; -var basicAuth = express.basicAuth(function(username, password) { - return (username == prop.username && password == prop.password); -}, 'Restrict area, please identify'); - //Mobile without auth -app.post('/logs/:appid', logger.addLog); +app.post('/logs/:appid', acraLogger.addLog); + //Administration with auth -app.get('/logs/:appid/:id', basicAuth, logger.findByIdDetail); -app.get('/logsexport/:appid/:id', basicAuth, logger.findByIdDetailExport); -app.get('/logs/:appid', basicAuth, logger.findAll); -app.get('/logsexport/:appid', basicAuth, logger.findAllExport); -app.get('/mobiles', basicAuth, logger.findAllCollections); -app.get('/logs/:appid/:id/delete', basicAuth, logger.deleteLog); -app.get('/logout', logger.logout); +app.get('/logs/:appid/:id', auth, acraLogger.findByIdDetail); +app.get('/logsexport/:appid/:id', auth, acraLogger.findByIdDetailExport); +app.get('/logs/:appid', auth, acraLogger.findAll); +app.get('/logsexport/:appid', auth, acraLogger.findAllExport); +app.get('/mobiles', auth, acraLogger.findAllCollections); +app.get('/logs/:appid/:id/delete', auth, acraLogger.deleteLog); +app.get('/logout', acraLogger.logout); + +prop.loadProperties(function() { + acraLogger.open(prop); + app.use(session({ + secret: prop.secret, + resave: false, + saveUninitialized: false, + cookie: { path: '/', httpOnly: true, secure: true, maxAge: null } + })); + console.log("------------------".yellow); + app.listen(prop.portWeb); + console.log('Listening on port '.yellow+prop.portWeb.red); +}); + + + + + + + + + + -console.log("------------------".yellow); -app.listen(prop.portWeb); -console.log('Listening on port '.yellow+prop.portWeb.red); + diff --git a/logger.js b/logger.js index 99aa00f..3e946c3 100644 --- a/logger.js +++ b/logger.js @@ -1,44 +1,44 @@ var mongo = require('mongodb'); -var prop = require('./properties.js'); var email = require('./email.js'); var moment = require('moment'); var async = require('async'); var ejs = require('ejs'); -var DB_NAME = prop.name_database; - -var Server = mongo.Server, - Db = mongo.Db, - BSON = mongo.BSONPure; - -var server = new Server(prop.mongodbIp, prop.mongodbPort, {auto_reconnect: true, safe:false,journal:true}); -var db= new Db(DB_NAME, server); - -db.open(function(err, db) { - if(!err) { - console.log("Connected to data base ".yellow+DB_NAME.red); - console.log("------------------".yellow); - } -}); +var l = { + server: null, + db: null, + prop: null, + open: function(p) { + l.prop = p; + l.server = new mongo.Server(l.prop.mongodbIp, l.prop.mongodbPort, {auto_reconnect: true, safe:false,journal:true}); + l.db = new mongo.Db(l.prop.name_database, l.server); + l.db.open(function(err, db) { + if(!err) { + console.log("Connected to data base ".yellow+l.prop.name_database.red); + console.log("------------------".yellow); + } + }); + } +}; //Export detail log of app in json format -exports.findByIdDetailExport = function(req, res) { +l.findByIdDetailExport = function(req, res) { var appid = req.params.appid; var id = req.params.id; console.log("findByIdDetailExport.appid:"+appid); console.log("findByIdDetailExport.id:"+id); - db.collection(appid, function(err, collection) { - collection.findOne({'_id':new BSON.ObjectID(id)}, function(err, item) { + l.db.collection(appid, function(err, collection) { + collection.findOne({'_id':new mongo.BSONPure.ObjectID(id)}, function(err, item) { res.send(item); }); }); }; //Export all logs of app in json format -exports.findAllExport = function(req, res) { +l.findAllExport = function(req, res) { var appid = req.params.appid; console.log("findAllExport.appid:"+appid); - db.collection(appid, function(err, collection) { + l.db.collection(appid, function(err, collection) { collection.find().toArray(function(err, items) { res.send(items); }); @@ -46,53 +46,53 @@ exports.findAllExport = function(req, res) { }; // VIEW - /views/detail.ejs -exports.findByIdDetail = function(req, res) { +l.findByIdDetail = function(req, res) { var appid = req.params.appid; var id = req.params.id; console.log("findByIdDetail.appid:"+appid); console.log("findByIdDetail.id:"+id); - db.collection(appid, function(err, collection) { - collection.findOne({'_id':new BSON.ObjectID(id)}, function(err, item) { - res.render('detail', {locals: {"log":item,"appid":appid,"id":id} }); + l.db.collection(appid, function(err, collection) { + collection.findOne({'_id':new mongo.BSONPure.ObjectID(id)}, function(err, item) { + res.render('detail', {log: item, appid: appid, id: id}); }); }); }; // VIEW - /views/listLogs.ejs -exports.findAll = function(req, res) { +l.findAll = function(req, res) { var appid = req.params.appid; console.log("findAll.appid:"+appid); loadListLogs(appid,res); }; // VIEW - /views/listMobiles.ejs -exports.findAllCollections = function(req, res) { - console.log("findAllCollections"); - db.collectionNames(function(err, names){ - res.render('listApps', {locals: {"list":names,"dbname":prop.name_database}}); - }); +l.findAllCollections = function(req, res) { + console.log("findAllCollections"); + l.db.listCollections().toArray(function(err, names) { + res.render('listApps', { list: names, dbname: l.prop.name_database }); + }); }; // VIEW - /views/delete.ejs -exports.deleteLog = function(req, res) { +l.deleteLog = function(req, res) { var appid = req.params.appid; var id = req.params.id; console.log("deleteLog.appid:"+appid); console.log("deleteLog.id:"+id); - db.collection(appid, function(err, collection) { - collection.remove({'_id':new BSON.ObjectID(id)}, {safe:true}, function(err, result) { - res.render('delete', {locals: {"appid":appid,"err":err}}); + l.db.collection(appid, function(err, collection) { + collection.remove({'_id':new mongo.BSONPure.ObjectID(id)}, {safe:true}, function(err, result) { + res.render('delete', {appid: appid, err: err}); }); }); } // IMPORTANT - Method without security access // Method to add info from mobile -exports.addLog = function(req, res) { +l.addLog = function(req, res) { var appid = req.params.appid; var log = req.body; console.log("addLog.appid:"+appid); - db.collection(appid, function(err, collection) { + l.db.collection(appid, function(err, collection) { collection.insert(log, {safe:true}, function(err, result) { if (err) { console.log("Add log error:"+err); @@ -125,10 +125,10 @@ function formatDate(toSave,collection) { } //Logout and delete cookie -exports.logout = function (req, res) { +l.logout = function (req, res) { console.log("logout"); req.session = null; - res.clearCookie(prop.key); + res.clearCookie(l.prop.key); res.redirect('/index.html'); } @@ -138,7 +138,7 @@ function loadListLogs(appid,res) { var resultSearch = {}; async.parallel([ function(callback) { - db.collection(appid, function(err, collection) { + l.db.collection(appid, function(err, collection) { collection.aggregate([ { $group : { _id : {android :"$ANDROID_VERSION"} , number : { $sum : 1 } } }, { $sort : { number : -1 } }, @@ -149,7 +149,7 @@ function loadListLogs(appid,res) { }); }); }, function(callback) { - db.collection(appid, function(err, collection) { + l.db.collection(appid, function(err, collection) { collection.aggregate([ { $group : { _id : {movile :"$PHONE_MODEL"} , number : { $sum : 1 } } }, { $sort : { number : -1 } }, @@ -161,7 +161,7 @@ function loadListLogs(appid,res) { }); }, function(callback) { - db.collection(appid, function(err, collection) { + l.db.collection(appid, function(err, collection) { collection.aggregate([ { $group : { _id : {year:{$year :"$USER_CRASH_DATE"},month:{$month :"$USER_CRASH_DATE"}} , number : { $sum : 1 } } }, { $sort : { _id : -1 } }, @@ -173,11 +173,11 @@ function loadListLogs(appid,res) { }); }, function(callback) { - db.collection(appid, function(err, collection) { + l.db.collection(appid, function(err, collection) { collection.find().toArray(function(err, items) { for (var i = 0; i < items.length; i++) { if (items[i].USER_APP_START_DATE.length > 0 ) { - items[i].USER_APP_START_DATE = moment(items[i].USER_APP_START_DATE).format(prop.date_format); + items[i].USER_APP_START_DATE = moment(items[i].USER_APP_START_DATE).format(l.prop.date_format); } } resultSearch.logs = items; @@ -186,7 +186,8 @@ function loadListLogs(appid,res) { }); } ], function(err) { - res.render('listLogs', {locals: {"list":resultSearch.logs,"mobiles":resultSearch.agg_phone,"android":resultSearch.android,"dates":resultSearch.dates,"appid":appid} }); + res.render('listLogs', {list: resultSearch.logs, mobiles: resultSearch.agg_phone, android: resultSearch.android, dates: resultSearch.dates, appid: appid}); }); } +module.exports = l; \ No newline at end of file diff --git a/package.json b/package.json index 6cf872e..5cc2b4b 100644 --- a/package.json +++ b/package.json @@ -2,17 +2,28 @@ "name": "acra_server_log", "description": "Acra Server with nodejs and mongodb", "author": "Diego Martin Moreno", - "version": "0.0.3", + "version": "0.0.4", + "main": "appAcra.js", + "repository": { + "type": "git", + "url": "https://github.com/RobHumphris/acra-node-server.git" + }, + "license": "ISC", "dependencies": { - "express": ">= 3.1.0", - "mongodb":">= 1.2.14", + "async": ">= 1.5.2", + "basic-auth": ">= 1.0.3", + "body-parser": ">= 1.15.0", + "colors": ">= 0.6.0-1", + "cookie-parser": ">= 1.4.1", + "ejs": ">= 2.4.1", + "emailjs": ">= 1.0.4", + "express": ">= 4.13.4", + "express-session": ">= 1.13.0", "log4js": ">= 0.5.7", - "emailjs" : ">= 0.3.4", - "colors" : ">= 0.6.0-1", - "ejs" : ">= 0.8.3", - "moment" : ">= 2.0.0", - "async" : ">= 0.2.8", - "node-properties-parser" : ">= 0.0.2" - }, - "engine": "node >= 0.8.0" -} \ No newline at end of file + "moment": ">= 2.0.0", + "mongodb": ">= 1.2.14", + "morgan": ">= 1.7.0", + "properties-parser": ">= 0.3.1", + "serve-favicon": ">= 2.3.0" + } +} diff --git a/properties.js b/properties.js index 43e15ee..7f941c9 100644 --- a/properties.js +++ b/properties.js @@ -1,4 +1,4 @@ -var proper = require("node-properties-parser"); +var proper = require("properties-parser"); var colors = require('colors'); var PORT_WEB = "port_web"; @@ -19,66 +19,52 @@ var FROM = "from"; var TO = "to"; var DATE_FORMAT = "date_format"; -console.log("------------------------".red); -console.log("ACRA SERVER LOG 0.0.3".bold.red); -console.log("------------------------".red); -console.log("Loading properties sync before start server...".red); -var par = proper.readSync("./acra_server.properties"); - -console.log("------------------------".red); - -exports.portWeb = portWeb = par[PORT_WEB]; -console.log("port_web:"+portWeb.red); - -exports.mongodbPort = mongodbPort = par[MONGODB_PORT]; -console.log("mongodbPort:"+mongodbPort.red); - -exports.mongodbIp = mongodbIp = par[MONGODB_IP]; -console.log("mongodbIp:"+mongodbIp.red); - -exports.username = username = par[USERNAME]; -console.log("username:"+username.red); - -exports.password = password = par[PASSWORD]; -console.log("password:"+password.red); - -exports.name_database = name_database = par[NAME_DATABASE]; -console.log("name_database:"+name_database.red); - -exports.secret = secret = par[SECRET]; -console.log("secret:"+secret.red); - -exports.key = key = par[KEY]; -console.log("key:"+key.red); - -exports.send_mail = send_mail = par[SEND_MAIL]; -console.log("send_mail:"+send_mail.red); - -exports.user_mail = user_mail = par[USER_MAIL]; -console.log("user_mail:"+user_mail.red); - -exports.password_mail = password_mail = par[PASSWORD_MAIL]; -console.log("password_mail:"+password_mail.red); - -exports.host = host = par[HOST]; -console.log("host:"+host.red); - -exports.ssl = ssl = par[SSL]; -console.log("ssl:"+ssl.red); - -exports.subject = subject = par[SUBJECT]; -console.log("subject:"+subject.red); - -exports.from = from = par[FROM]; -console.log("from:"+from.red); - -exports.to = to = par[TO]; -console.log("to:"+to.red); - -exports.date_format = date_format = par[DATE_FORMAT]; -console.log("date_format:"+date_format.red); - -console.log("------------------------".red); - - - +var p = {}; + +p.loadProperties = function(next) { + proper.read('./acra_server.properties', function(err, data) { + console.log("------------------------".red); + console.log("ACRA SERVER LOG 0.0.4".bold.red); + console.log("------------------------".red); + console.log("Loading properties sync before start server...".red); + console.log("------------------------".red); + p.portWeb = portWeb = data[PORT_WEB]; + console.log("port_web:"+p.portWeb.red); + p.mongodbPort = mongodbPort = data[MONGODB_PORT]; + console.log("mongodbPort:"+p.mongodbPort.red); + p.mongodbIp = mongodbIp = data[MONGODB_IP]; + console.log("mongodbIp:"+p.mongodbIp.red); + p.username = username = data[USERNAME]; + console.log("username:"+p.username.red); + p.password = password = data[PASSWORD]; + console.log("password:"+p.password.red); + p.name_database = name_database = data[NAME_DATABASE]; + console.log("name_database:"+p.name_database.red); + p.secret = secret = data[SECRET]; + console.log("secret:"+p.secret.red); + p.key = key = data[KEY]; + console.log("key:"+p.key.red); + p.send_mail = send_mail = data[SEND_MAIL]; + console.log("send_mail:"+p.send_mail.red); + p.user_mail = user_mail = data[USER_MAIL]; + console.log("user_mail:"+p.user_mail.red); + p.password_mail = password_mail = data[PASSWORD_MAIL]; + console.log("password_mail:"+p.password_mail.red); + p.host = host = data[HOST]; + console.log("host:"+p.host.red); + p.ssl = ssl = data[SSL]; + console.log("ssl:"+p.ssl.red); + p.subject = subject = data[SUBJECT]; + console.log("subject:"+p.subject.red); + p.from = from = data[FROM]; + console.log("from:"+from.red); + p.to = to = data[TO]; + console.log("to:"+p.to.red); + p.date_format = date_format = data[DATE_FORMAT]; + console.log("date_format:"+p.date_format.red); + console.log("------------------------".red); + next(); + }); +}; + +module.exports = p; diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b4daca2d80d90ea3a07e147b714424dab9c3195c GIT binary patch literal 1406 zcmeHGSx8i26#ix=(@Ja1X|%=E(cCJprY)8&wpo@-i)H0r=JjS{HnwUS^`u0WQWQN2 z8bXv&4HQ%ll@e(nQW#VZ6B!6mI4(JN`#X1h2z>0d{(HZBzH`q1o&Rv|y?~A`qY>`K zdjMu)kpwLiOwhrLo^CR3Cvc`pP!$!7aJj^a&kcH1rDdVWY{B!kYB1(P@9hkHc~${Y zVPL8Zl?|dYkRuI)Zd z&O;^Mb;$>#vV;#!Iux2h;37WOKLAm)KL+7aRfq(YNs!3O1cmVFiIw!!Ga<*(lz!;1;+F=Wdg-enkiqtzB!_dHY ze0|eHGocy(eDUX-_|N|N2?&C4aAWT3b*aba8oXo469nsNlh^sOtw(mOS?Ts84(vW$ zvuSqTsdM9b+nK1){D30;41p80TUfUJtT8J^pT-Fsr}+Y(u{d(_LL!_HZX;8=Aj~hD zGCQN^OqpIx0h{OAMdZ&rVMw1@om47R6y~f-;(2awfpBuZcYNHgrB#QvOybrb<%HO& z2_Zq;{#kmiGB8G`)m(mT$>v)9wmti%`M6J8ky&o>_3#fi>k}!ht>g_{Qi;(`C%$0% Jt^Rsx+TS|7YB>M^ literal 0 HcmV?d00001 From d990558419887be3535a03573ae998cd721badd8 Mon Sep 17 00:00:00 2001 From: Rob Humphris Date: Tue, 19 Apr 2016 11:52:05 +0100 Subject: [PATCH 2/7] Dockerised versions --- .dockerignore | 2 ++ .gitignore | 3 ++- Dockerfile | 11 +++++++++++ README.md | 10 ++-------- appAcra.js | 2 +- dockerrun.sh | 1 + email.js | 7 +++++-- 7 files changed, 24 insertions(+), 12 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 dockerrun.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..8568ba9 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +.git +node_modules \ No newline at end of file diff --git a/.gitignore b/.gitignore index 2ef57ac..918e490 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ npm-debug.log node_modules -.idea \ No newline at end of file +.idea +.dockerrun.sh diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..0988042 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,11 @@ +FROM node:4.2.0-onbuild +MAINTAINER Rob Humphris + +#Run npm install +RUN npm install + +#Expose node port +EXPOSE 3000 + +#Start mongo and node +CMD node appAcra.js \ No newline at end of file diff --git a/README.md b/README.md index dc92ab2..525be15 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ - ACRA Node Server (v. 0.0.3) + ACRA Node Server (v. 0.0.4) ================ Server [ACRA](http://acra.ch/) for [Node.js](http://nodejs.org/) with data base [Mongodb](http://www.mongodb.org/) Save all the crash reports in your own server. -### version 0.0.3 +### version 0.0.4 * Updated to work with Express 4.x * Updated to work with newer MongoDB @@ -20,14 +20,12 @@ Save all the crash reports in your own server. Technologies Used ------------ - Server = [node.js, express, ejs, mongodb, emailjs, node-properties-parser, colors, moment, async] Client = [bootstrap, jquery, tablesorter, jqplot] Installation ------------ - 1. Download and unzip (or git clone) into a directory. 2. Run "$ npm install" 3. Configure /acra_server.properties with mongodb, port web, user and password access and email credentials. @@ -36,7 +34,6 @@ Installation Philosophy ------------ - * Build a Server to replace Google Docs. * Write using modern tecnologies as Node.js and Mongodb. * Simple configuration with a only one properties file. @@ -44,7 +41,6 @@ Philosophy Features ------------ - * Basic front end web pages. * Send emails when receive ACRA report. * Login system to protect access. @@ -150,7 +146,6 @@ date_format=YYYY-MM-DD hh:mm:ss ``` ## Configuration Mongodb - Automatic configuration: * Creation of DB automatic @@ -158,7 +153,6 @@ Automatic configuration: * Independent collections by App ## Access server - * http://my_server:port_server (and login) diff --git a/appAcra.js b/appAcra.js index cce0e0a..12ae41a 100644 --- a/appAcra.js +++ b/appAcra.js @@ -56,7 +56,7 @@ app.get('/mobiles', auth, acraLogger.findAllCollections); app.get('/logs/:appid/:id/delete', auth, acraLogger.deleteLog); app.get('/logout', acraLogger.logout); -prop.loadProperties(function() { +prop.loadProperties(() => { acraLogger.open(prop); app.use(session({ secret: prop.secret, diff --git a/dockerrun.sh b/dockerrun.sh new file mode 100644 index 0000000..fd3f094 --- /dev/null +++ b/dockerrun.sh @@ -0,0 +1 @@ +docker run -d --name acra-node-server --link mongo:mongodb elektron/acra-node-server \ No newline at end of file diff --git a/email.js b/email.js index e2bbbf1..93b5953 100644 --- a/email.js +++ b/email.js @@ -8,7 +8,7 @@ var server = email.server.connect({ ssl: prop.ssl }); -exports.send = function send (mobile,log) { +exports.send = function send(mobile,log) { if (prop.send_mail == 'yes') { console.log('Send email with error model:'+log.PHONE_MODEL); // send the message and get a callback with an error or details of the message that was sent @@ -24,7 +24,10 @@ exports.send = function send (mobile,log) { to: prop.to, cc: "", subject: prop.subject+ " from Mobile "+mobile - }, function(err, message) { console.log(err || message); }); + }, (err, message) => + { + console.log(err || message); + }); } } From 27b5ecdd02ee5c6c911dcffe39f45897859d5fda Mon Sep 17 00:00:00 2001 From: Rob Humphris Date: Wed, 4 May 2016 08:39:13 +0100 Subject: [PATCH 3/7] Improved database opening and error handling. --- .gitignore | 1 + Dockerfile | 2 +- appAcra.js | 9 +++++---- logger.js | 3 ++- package.json | 8 ++++++-- 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 918e490..f0103aa 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ npm-debug.log node_modules .idea .dockerrun.sh +.vscode \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 0988042..1d0733c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:4.2.0-onbuild +FROM node:4.4.1-slim MAINTAINER Rob Humphris #Run npm install diff --git a/appAcra.js b/appAcra.js index 12ae41a..f27bf98 100644 --- a/appAcra.js +++ b/appAcra.js @@ -12,7 +12,7 @@ var basicAuth = require('basic-auth'); //function control errors function clientErrorHandler(err, req, res, next) { console.log('client error handler found in ip:'+req.ip, err); - res.status(500); + res.sendStatus(500); res.render('error', {locals: {"error":err} }); } @@ -29,7 +29,7 @@ app.use(bodyParser.json()); function auth (req, res, next) { function unauthorized(res) { res.set('WWW-Authenticate', 'Basic realm=Authorization Required'); - return res.send(401); + return res.sendStatus(401); }; var user = basicAuth(req); @@ -57,8 +57,8 @@ app.get('/logs/:appid/:id/delete', auth, acraLogger.deleteLog); app.get('/logout', acraLogger.logout); prop.loadProperties(() => { - acraLogger.open(prop); - app.use(session({ + acraLogger.open(prop, function(err) { + app.use(session({ secret: prop.secret, resave: false, saveUninitialized: false, @@ -67,6 +67,7 @@ prop.loadProperties(() => { console.log("------------------".yellow); app.listen(prop.portWeb); console.log('Listening on port '.yellow+prop.portWeb.red); + }); }); diff --git a/logger.js b/logger.js index 3e946c3..22fe17d 100644 --- a/logger.js +++ b/logger.js @@ -8,7 +8,7 @@ var l = { server: null, db: null, prop: null, - open: function(p) { + open: function(p, cb) { l.prop = p; l.server = new mongo.Server(l.prop.mongodbIp, l.prop.mongodbPort, {auto_reconnect: true, safe:false,journal:true}); l.db = new mongo.Db(l.prop.name_database, l.server); @@ -17,6 +17,7 @@ var l = { console.log("Connected to data base ".yellow+l.prop.name_database.red); console.log("------------------".yellow); } + cb(err); }); } }; diff --git a/package.json b/package.json index 5cc2b4b..808bae5 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "acra_server_log", + "name": "acra-node-server", "description": "Acra Server with nodejs and mongodb", "author": "Diego Martin Moreno", "version": "0.0.4", @@ -8,7 +8,6 @@ "type": "git", "url": "https://github.com/RobHumphris/acra-node-server.git" }, - "license": "ISC", "dependencies": { "async": ">= 1.5.2", "basic-auth": ">= 1.0.3", @@ -25,5 +24,10 @@ "morgan": ">= 1.7.0", "properties-parser": ">= 0.3.1", "serve-favicon": ">= 2.3.0" + }, + "devDependencies": { + "mocha": "^2.2.5", + "supertest": "^1.0.1", + "chai": "^2.3.0" } } From 8e38eb7668f920d7970ca880aa83594e3d8e4bf7 Mon Sep 17 00:00:00 2001 From: Rob Humphris Date: Wed, 4 May 2016 08:41:46 +0100 Subject: [PATCH 4/7] Bumped version number in login page --- public/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/index.html b/public/index.html index 404e77d..5f03a74 100644 --- a/public/index.html +++ b/public/index.html @@ -63,7 +63,7 @@

ACRA Node Server

- © 2013 Sinclinal.com - Version 0.0.3 + © 2013 Sinclinal.com - Version 0.0.4 From a1c7039b3804bc72f92ce256e680223578f890e2 Mon Sep 17 00:00:00 2001 From: Rob Humphris Date: Wed, 4 May 2016 10:24:03 +0100 Subject: [PATCH 5/7] Updated Dockerfile. --- Dockerfile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Dockerfile b/Dockerfile index 1d0733c..b26bd55 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,12 @@ FROM node:4.4.1-slim MAINTAINER Rob Humphris +# Copy the source to the Docker's usr directory +COPY . /usr/src/app + +# Set the working directory accordingly +WORKDIR /usr/src/app + #Run npm install RUN npm install From d787b7833baf39dc32c6664d0c0ecb6648d961b3 Mon Sep 17 00:00:00 2001 From: Antonios Galanopoulos Date: Thu, 5 May 2016 10:45:27 +0100 Subject: [PATCH 6/7] Add support for env vars use the defaults from the config file if not set --- properties.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/properties.js b/properties.js index 7f941c9..c2837c8 100644 --- a/properties.js +++ b/properties.js @@ -30,27 +30,27 @@ p.loadProperties = function(next) { console.log("------------------------".red); p.portWeb = portWeb = data[PORT_WEB]; console.log("port_web:"+p.portWeb.red); - p.mongodbPort = mongodbPort = data[MONGODB_PORT]; + p.mongodbPort = mongodbPort = process.env.ACRA_MONGODB_PORT || data[MONGODB_PORT]; console.log("mongodbPort:"+p.mongodbPort.red); - p.mongodbIp = mongodbIp = data[MONGODB_IP]; + p.mongodbIp = mongodbIp = process.env.ACRA_MONGODB_IP || data[MONGODB_IP]; console.log("mongodbIp:"+p.mongodbIp.red); - p.username = username = data[USERNAME]; + p.username = username = process.env.ACRA_USERNAME || data[USERNAME]; console.log("username:"+p.username.red); - p.password = password = data[PASSWORD]; + p.password = password = process.env.ACRA_PASSWORD || data[PASSWORD]; console.log("password:"+p.password.red); - p.name_database = name_database = data[NAME_DATABASE]; + p.name_database = name_database = process.env.ACRA_DB || data[NAME_DATABASE]; console.log("name_database:"+p.name_database.red); - p.secret = secret = data[SECRET]; + p.secret = secret = process.env.ACRA_SECRET ||data[SECRET]; console.log("secret:"+p.secret.red); - p.key = key = data[KEY]; + p.key = key = process.env.ACRA_KEY || data[KEY]; console.log("key:"+p.key.red); - p.send_mail = send_mail = data[SEND_MAIL]; + p.send_mail = send_mail = process.env.ACRA_SEND_MAIL || data[SEND_MAIL]; console.log("send_mail:"+p.send_mail.red); - p.user_mail = user_mail = data[USER_MAIL]; + p.user_mail = user_mail = process.env.ACRA_USER_MAIL || data[USER_MAIL]; console.log("user_mail:"+p.user_mail.red); - p.password_mail = password_mail = data[PASSWORD_MAIL]; + p.password_mail = password_mail = process.env.ACRA_PASSWORD_MAIL ||data[PASSWORD_MAIL]; console.log("password_mail:"+p.password_mail.red); - p.host = host = data[HOST]; + p.host = host = process.env.ACRA_HOST || data[HOST]; console.log("host:"+p.host.red); p.ssl = ssl = data[SSL]; console.log("ssl:"+p.ssl.red); From 891d9f88ef4bf0bd467d3498ba8c91b5133a2642 Mon Sep 17 00:00:00 2001 From: Rob Humphris Date: Tue, 10 May 2016 13:56:46 +0100 Subject: [PATCH 7/7] Tested with AH's App, should be ready to test on the cloud. --- acra_server.properties | 3 ++- appAcra.js | 1 + logger.js | 22 ++-------------------- 3 files changed, 5 insertions(+), 21 deletions(-) diff --git a/acra_server.properties b/acra_server.properties index f5ff3e2..d8c57d9 100644 --- a/acra_server.properties +++ b/acra_server.properties @@ -13,7 +13,8 @@ secret = b29a25fe160453b475d4243d12yrty342345752eeaa5bc # port mongodb mongodb_port = 27017 # Ip mongodb -mongodb_ip = localhost +#mongodb_ip = localhost +mongodb_ip = db.checkit-develop.elektron-dev.com # Name Data base name_database = acraloggerdb diff --git a/appAcra.js b/appAcra.js index f27bf98..c3c8cbe 100644 --- a/appAcra.js +++ b/appAcra.js @@ -46,6 +46,7 @@ function auth (req, res, next) { //Mobile without auth app.post('/logs/:appid', acraLogger.addLog); +app.put('/logs/:appid', acraLogger.addLog); //Administration with auth app.get('/logs/:appid/:id', auth, acraLogger.findByIdDetail); diff --git a/logger.js b/logger.js index 22fe17d..ff72ca8 100644 --- a/logger.js +++ b/logger.js @@ -99,32 +99,14 @@ l.addLog = function(req, res) { console.log("Add log error:"+err); res.send({'error':'An error has occurred'}); } else { - console.log("addLog:OK save"); - //format date text to date format - //to aggregate dates - formatDate(result,collection); - //After insert send email - email.send(appid,log); + console.log("addLog:OK save"); + email.send(appid, log); res.send(result[0]); } }); }); } -function formatDate(toSave,collection) { - var doc = toSave[0]; - doc.USER_CRASH_DATE = new Date(doc.USER_CRASH_DATE); - collection.update({_id:doc._id }, { - $set: { 'USER_CRASH_DATE': doc.USER_CRASH_DATE }, - }, function(err) { - if (!err) { - console.log("Error:"+err); - } else { - console.log("Modify date format"); - } - }); -} - //Logout and delete cookie l.logout = function (req, res) { console.log("logout");