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");