diff --git a/.gitignore b/.gitignore index 08ddf29..3206a9e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ */bower_components/* */node_modules/* *.log +sftp-config.json +.remote-sync.json diff --git a/www/app.js b/www/app.js deleted file mode 100644 index 736a518..0000000 --- a/www/app.js +++ /dev/null @@ -1,98 +0,0 @@ -var express = require('express'), - path = require('path'), - fs = require('fs'), - logger = require('morgan'), - methodOverride = require('method-override'), - bodyParser = require('body-parser'), - errorHandler = require('errorhandler'); -var app = express(); -var fns; -app.locals.DB_TYPE = "SQLite"; // or "MySQL" - -/** -* Configuration -*/ -if (app.locals.DB_TYPE == "MySQL"){ - fns = require('./functions_MySQL.js'); - var mysql = require('mysql'); - var db_config = { - host: 'localhost', - user: 'website', - password: 'henrypump' - }; - var handleDisconnect = function () { - console.log("Handling db disconnect gracefully"); - app.locals.db = mysql.createConnection(db_config); - app.locals.db.connect(function (err) { - if (err) { - console.log('error when connecting to db:', err); - setTimeout(handleDisconnect, 2000); - } - }); - app.locals.db.on('error', function (err) { - console.log('db error', err); - if (err.code === 'PROTOCOL_CONNECTION_LOST') { - handleDisconnect(); - } else { - throw err; - } - }); - }; - handleDisconnect(); -} else { - fns = require('./functions_SQLite.js'); -} - -app.set('port', process.env.PORT || 80); -app.set('views', path.join(__dirname, 'views')); -app.engine('.html', require('ejs').renderFile); -app.set('view engine', 'html'); -//app.use(favicon(__dirname + '/public/img/favicon.ico')); -app.use(logger('dev')); -app.use(methodOverride()); -app.use(bodyParser.json()); -app.use(bodyParser.urlencoded({extended: true})); - -//app.use(express["static"](path.join(__dirname, 'public'))); -app.use(express.static(__dirname + '/public')); -app.use('/bower_components', express.static(__dirname + '/bower_components')); -app.use('/node_modules', express.static(__dirname + '/node_modules')); - -/** -* Routes -*/ -var angular = function(req, res) { - res.render('angularIndex'); -}; - -app.post('/json/tag/add', fns.createTag); // Adds a tag to the scan list -app.post('/json/tag/update/', fns.updateTag); // Updates tag data -app.get('/json/tag/delete/:tag', fns.deleteTag); // Removes a tag from the scan list -app.get('/json/tag/:id', fns.getTag); // Gets a specific tag in the scan list -app.get('/json/tag', fns.getAllTags); // Lists all tags in the scan list -app.get('/json/val/:tag', fns.latestValueSingleTag); // Gets the latest value of a single tag -app.get('/json/series/:tag/:hours', fns.seriesTagValues); // Gets all the values of a tag for the last X hours -app.get('/json/valBetween/:tag/:startDatetime/:endDatetime', fns.seriesTagValuesBetween); // Gets the values of a tag between the start time and end time -app.get('/json/CSV/all', fns.allDataCSV); // Gets a CSV of all values stored -app.get('/json/CSV/:tag/:startDatetime/:endDatetime', fns.seriesCSVBetween); // Gets a CSV of the values of a tag between the start time and end time -app.get('/json/CSV/:tag/:hours', fns.seriesCSV); // Gets a CSV of the values of a tag for the last x hours -app.get('/json/all', fns.latestValueAllTags); // Gets the latest values of all tags in the scan list -app.get('/json/config', fns.getSetup); // Gets the contents of the config table -app.post('/json/config', fns.updateSetup); // Adds a new parameter to the config table -app.get('/json/logger/status', fns.checkLoggerStatus); // Gets the status of the data logger -app.get('/json/logger/restart', fns.restartLogger); // Restarts the data logger - - - -app.get('*', angular); - -/** -* Start Server -*/ -connectionsArray = []; -s_port = 3000; -var server = app.listen(s_port, function () { - var host = server.address().address; - var port = server.address().port; - console.log('POConsole listening at http://%s:%s', host, port); -}); diff --git a/www/dbcreate_SQLite.sql b/www/dbcreate_SQLite.sql index a63ee31..23b9879 100644 --- a/www/dbcreate_SQLite.sql +++ b/www/dbcreate_SQLite.sql @@ -13,6 +13,7 @@ CREATE TABLE IF NOT EXISTS tags ( data_type TEXT, change_threshold REAL, guarantee_sec INTEGER, + map_function TEXT, units TEXT, minExpected REAL, maxExpected REAL, diff --git a/www/functions_MySQL.js b/www/functions_MySQL.js deleted file mode 100644 index 4d50eca..0000000 --- a/www/functions_MySQL.js +++ /dev/null @@ -1,80 +0,0 @@ -// app.get('/json/add/:tag', fns.addTag); // Adds a tag to the scan list -// app.get('/json/remove/:tag', fns.removeTag); // Removes a tag from the scan list -// app.get('/json/val/:tag', fns.latestTagValue); // Gets the latest value of a single tag -// app.get('/json/series/:tag/:hours', fns.seriesTagValues); // Gets all the values of a tag for the last X hours -// app.get('/json/tags', fns.allTags); // Lists all tags in the scan list -// app.get('/json/all', fns.allValues); // Gets the latest values of all tags in the scan list - - -var getScanList = function(sl){ - var query = "SELECT * FROM TagData.tags WHERE deleted = 0;"; - -}; - -exports.addTag = function(req, res){ - var vals = { - tagName: req.params.tagName, - units: req.params.units, - }; - var query = "INSERT INTO TagData.tags SET ?"; - req.app.locals.db.query(query, vals, function(err, rows, fields) { - if (err) { - res.json({status:"error", message:err}); - console.log(err); - } else { - res.json({status:"OK"}); - } - }); -}; - -exports.removeTag = function(req, res){ - var query = "UPDATE TagData.tags SET deleted = 1 WHERE id = " + parseInt(req.params.tag) + ";"; - req.app.locals.db.query(query, function(err, rows, fields) { - if (err) { - res.json({status:"error", message:err}); - console.log(err); - } else { - res.json({status:"OK"}); - } - }); -}; - -exports.latestTagValue = function(req, res){ - var query = "SELECT * FROM TagData.values WHERE id = (SELECT MAX(id) FROM TagData.values WHERE tagID = (SELECT id FROM TagData.tags WHERE tagName = '" + req.params.tag + "'));"; - req.app.locals.db.query(query, function(err, rows, fields) { - if (err) { - res.json({status:"error", message:err}); - console.log(err); - } else { - res.json({status:"OK", tag_val:rows[0]}); - } - }); -}; - -exports.seriesTagValues = function(req, res){ - var query = "SELECT * FROM TagData.values WHERE tagID = "+ req.params.tag +" AND dateAdded > DATE_SUB(NOW(),INTERVAL "+ req.params.hours +" HOUR)"; - req.app.locals.db.query(query, function(err, rows, fields) { - if (err){ - console.log(err); - res.json({status:"error", message:err, query:query}); - } else { - res.json({status:"OK", tag: req.params.tag, values:rows}); - } - }); -}; - -exports.allTags = function(req, res){ - var query = "SELECT * FROM TagData.tags WHERE deleted = 0;"; - req.app.locals.db.query(query, function(err, rows, fields) { - if (err) { - res.json({status:"error", message:err}); - console.log(err); - } else { - res.json({status:"OK", tags:rows}); - } - }); -}; - -exports.allValues = function(req, res){ - res.json({status:"error", message:"not implemented"}); -}; diff --git a/www/functions_SQLite.js b/www/functions_SQLite.js deleted file mode 100644 index bc17b49..0000000 --- a/www/functions_SQLite.js +++ /dev/null @@ -1,423 +0,0 @@ -// var dbFile = "/usr/db/data.db"; -var dbFile = "/mnt/usb/data.db"; -// var dbFile = '/Users/patrickjmcd/data.db'; - -var dString_to_sqlite = function(dString){ - /** - * Takes a date string in the form YYYYMMDD_HHmmSS and returns it in SQLite format (YYYY-MM-DD HH:mm:SS) - * @param {String} dString - * @return {String} sqliteString - */ - var re = /(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})/; - var fd = re.exec(dString); - if (fd){ - var sqliteString = ""; - return sqliteString.concat(fd[1], "-", fd[2], "-", fd[3], " ", fd[4], ":", fd[5], ":", fd[6]); - } else { - return null; - } -}; - - - -var sqlite_to_dString = function(sqliteDate){ - /** - * Takes a sqlite date string in the form YYYY-MM-DD HH:mm:SS and returns it in format YYYYMMDD_HHmmSS - * @param {String} sqliteDate - * @return {String} dString - */ - var re = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/; - var fd = re.exec(sqliteDate); - if (fd){ - var dString = ""; - return dString.concat(fd[1], fd[2], fd[3], "_", fd[4], fd[5], fd[6]); - } else { - return null; - } -}; - -var getAllTags = function(callback){ - var sqlite3 = require('sqlite3').verbose(); - var db = new sqlite3.Database(dbFile); - - db.serialize(function(){ - var query = "SELECT * FROM tags WHERE deleted = 0"; - var prepQuery = db.prepare(query); - prepQuery.all(function(err, rows) { - prepQuery.finalize(); - db.close(); - if (err) { - return callback(err, null); - console.log(err); - } else { - return callback(null, rows); - } - }); - }); -}; - - -exports.getAllTags = function(req, res){ - var sqlite3 = require('sqlite3').verbose(); - var db = new sqlite3.Database(dbFile); - - db.serialize(function(){ - var query = "SELECT * FROM tags WHERE deleted = 0"; - var prepQuery = db.prepare(query); - prepQuery.all(function(err, rows) { - prepQuery.finalize(); - db.close(); - if (err) { - res.json({status:"error", message:err}); - console.log(err); - } else { - res.json({status:"OK", tags:rows}); - } - }); - }); -}; - -exports.createTag = function(req, res){ - var sqlite3 = require('sqlite3').verbose(); - var db = new sqlite3.Database(dbFile); - - db.serialize(function(){ - var query = "INSERT INTO tags (tagName, units, minExpected, maxExpected, vanityName, description) VALUES (?, ?, ?, ?, ?, ?)"; - var prepQuery = db.prepare(query); - prepQuery.run(req.body.tagName, req.body.units, req.body.minExpected, req.body.maxExpected, req.body.vanityName, req.body.description, function(err){ - prepQuery.finalize(); - db.close(); - if (err) { - res.json({status:"error", message:err}); - console.log(err); - } else { - res.json({status:"OK"}); - } - }); - }); -}; - -exports.getTag = function(req, res){ - var sqlite3 = require('sqlite3').verbose(); - var db = new sqlite3.Database(dbFile); - - db.serialize(function(){ - var query = "SELECT * FROM tags WHERE id = ?"; - var prepQuery = db.prepare(query); - prepQuery.all(req.params.id, function(err, rows) { - prepQuery.finalize(); - db.close(); - if (err) { - res.json({status:"error", message:err}); - console.log(err); - } else { - res.json({status:"OK", tags:rows}); - } - }); - }); -}; - -exports.updateTag = function(req, res){ - var sqlite3 = require('sqlite3').verbose(); - var db = new sqlite3.Database(dbFile); - - db.serialize(function(){ - var query = "UPDATE tags set tagName = ?, units = ?, minExpected = ?, maxExpected = ?, vanityName = ?, description = ? WHERE id = ?"; - var prepQuery = db.prepare(query); - prepQuery.run(req.body.tagName, req.body.units, req.body.minExpected, req.body.maxExpected, req.body.vanityName, req.body.description, req.body.id, function(err) { - prepQuery.finalize(); - db.close(); - if (err) { - res.json({status:"error", message:err}); - console.log(err); - } else { - res.json({status:"OK"}); - } - }); - }); -}; - -exports.deleteTag = function(req, res){ - var sqlite3 = require('sqlite3').verbose(); - var db = new sqlite3.Database(dbFile); - - db.serialize(function(){ - var query = "UPDATE tags SET deleted = 1 WHERE id = ?"; - var prepQuery = db.prepare(query); - prepQuery.run(req.params.tag, function(err) { - prepQuery.finalize(); - db.close(); - if (err) { - res.json({status:"error", message:err}); - console.log(err); - } else { - res.json({status:"OK"}); - } - }); - }); -}; - -exports.seriesTagValues = function(req, res){ - var sqlite3 = require('sqlite3').verbose(); - var db = new sqlite3.Database(dbFile); - - db.serialize(function(){ - var query = "SELECT * FROM vals WHERE tagID = ? AND dateAdded > DATETIME('now', '-1 HOUR')"; - var prepQuery = db.prepare(query); - prepQuery.all(parseInt(req.params.tag), function(err, rows){ - prepQuery.finalize(); - db.close(); - if (err){ - console.log(err); - res.json({status:"error", message:err, query:query}); - } else { - res.json({status:"OK", tag: req.params.tag, vals:rows}); - } - }); - }); -}; - -exports.seriesTagValuesBetween = function(req, res){ - var sqlite3 = require('sqlite3').verbose(); - var db = new sqlite3.Database(dbFile); - - db.serialize(function(){ - var query = "SELECT * FROM vals WHERE tagID = ? AND dateAdded >= DATETIME(?) AND dateAdded <= DATETIME(?)"; - var prepQuery = db.prepare(query); - prepQuery.all(parseInt(req.params.tag), dString_to_sqlite(req.params.startDatetime), dString_to_sqlite(req.params.endDatetime), function(err, rows){ - prepQuery.finalize(); - db.close(); - if (err){ - console.log(err); - res.json({status:"error", message:err, query:query}); - } else { - res.json({status:"OK", tag: req.params.tag, startDatetime: dString_to_sqlite(req.params.startDatetime), endDatetime: dString_to_sqlite(req.params.endDatetime), vals:rows}); - } - }); - }); -}; - -var createCSVrow = function(header, dataRow){ - var i = header.indexOf(dataRow.vanityName); - var csvRow = dataRow.id.toString() + "," + dataRow.dateAdded + ","; - if (i >= 0){ - for (var j = 2; j < header.length; j++){ - if (j == i){ - csvRow = csvRow + dataRow.val.toString()+ ","; - } else { - csvRow = csvRow + ","; - } - } - csvRow = csvRow.slice(0, -1) + "\r"; - return csvRow; - } -}; - -exports.allDataCSV = function(req, res){ - var sqlite3 = require('sqlite3').verbose(); - var db = new sqlite3.Database(dbFile); - db.serialize(function(){ - var query = "SELECT v.id, t.vanityName, v.val, v.dateAdded FROM tags t JOIN vals v ON t.id = v.tagID"; - var prepQuery = db.prepare(query); - prepQuery.all( function(err, rows){ - prepQuery.finalize(); - db.close(); - if (err){ - console.log(err); - res.json({status:"error", message:err, query:query}); - } else { - getAllTags(function(err,tags){ - if (err){ - console.log(err); - } else { - var csvString = ""; - var da = ["id", "DateAdded"]; - var tagVanityNames = tags.map(function(t){return t.vanityName;}); - var h = da.concat(tagVanityNames); - console.log(h); - csvString = csvString + h.join(",") + "\r"; - for (var i= 0; i < rows.length; i++){ - csvString = csvString + createCSVrow(h, rows[i]); - } - res.set('Content-Type', 'text/csv'); - res.set('Content-Disposition', "attachment;filename=tagdata.csv"); - res.send(csvString); - } - }); - } - }); - }); -}; - -exports.seriesCSV = function(req, res){ - var sqlite3 = require('sqlite3').verbose(); - var db = new sqlite3.Database(dbFile); - - db.serialize(function(){ - var query = "SELECT v.id, t.vanityName, v.val, v.dateAdded FROM tags t JOIN vals v ON t.id = v.tagID WHERE tagID = ? AND v.dateAdded > DATETIME('now', '-1 HOUR')"; - var prepQuery = db.prepare(query); - prepQuery.all(parseInt(req.params.tag), function(err, rows){ - prepQuery.finalize(); - db.close(); - if (err){ - console.log(err); - res.json({status:"error", message:err, query:query}); - } else { - var csvString = ""; - var h = ["id", "DateAdded", rows[0].vanityName]; - csvString = csvString + h.join(",") + "\r"; - for (var i= 0; i < rows.length; i++){ - csvString = csvString + [rows[i].id, rows[i].dateAdded, rows[i].val].join(",") + "\r"; - } - res.set('Content-Type', 'text/csv'); - res.set('Content-Disposition', "attachment;filename=tagdata.csv"); - res.send(csvString); - } - }); - }); -}; - -exports.seriesCSVBetween = function(req, res){ - var sqlite3 = require('sqlite3').verbose(); - var db = new sqlite3.Database(dbFile); - - db.serialize(function(){ - var query = "SELECT v.id, t.vanityName, v.val, v.dateAdded FROM tags t JOIN vals v ON t.id = v.tagID WHERE tagID = ? AND dateAdded >= DATETIME(?) AND dateAdded <= DATETIME(?)"; - var prepQuery = db.prepare(query); - prepQuery.all(parseInt(req.params.tag), dString_to_sqlite(req.params.startDatetime), dString_to_sqlite(req.params.endDatetime), function(err, rows){ - prepQuery.finalize(); - db.close(); - if (err){ - console.log(err); - res.json({status:"error", message:err, query:query}); - } else { - var csvString = ""; - var h = ["id", "DateAdded", rows[0].vanityName]; - csvString = csvString + h.join(",") + "\r"; - for (var i= 0; i < rows.length; i++){ - csvString = csvString + [rows[i].id, rows[i].dateAdded, rows[i].val].join(",") + "\r"; - } - res.set('Content-Type', 'text/csv'); - res.set('Content-Disposition', "attachment;filename=tagdata.csv"); - res.send(csvString); - } - }); - }); -}; - -exports.latestValueSingleTag = function(req, res){ - var sqlite3 = require('sqlite3').verbose(); - var db = new sqlite3.Database(dbFile); - - db.serialize(function(){ - var query = "SELECT * FROM vals WHERE id = (SELECT MAX(id) FROM vals WHERE tagID = ?)"; - var prepQuery = db.prepare(query); - prepQuery.all(req.params.tag, function(err, rows) { - console.log(rows); - prepQuery.finalize(); - db.close(); - if (err) { - res.json({status:"error", message:err}); - console.log(err); - } else { - res.json({status:"OK", tag_val:rows[0]}); - } - }); - }); -}; - -exports.latestValueAllTags = function(req, res){ - var sqlite3 = require('sqlite3').verbose(); - var db = new sqlite3.Database(dbFile); - - db.serialize(function(){ - var query = "SELECT t.tagName as tagName, t.vanityName as vanityName, t.description as description, t.units as units, t.id as t_id, t.minExpected as min, t.maxExpected as max, MAX(v.id) as v_id, v.val as val, v.dateAdded as dtime FROM vals v JOIN tags t ON v.tagID = t.id WHERE t.deleted = 0 GROUP BY v.tagID"; - var prepQuery = db.prepare(query); - prepQuery.all(req.params.id, function(err, rows) { - prepQuery.finalize(); - db.close(); - if (err) { - res.json({status:"error", message:err}); - console.log(err); - } else { - res.json({status:"OK", vals:rows}); - } - }); - }); -}; - -exports.checkLoggerStatus = function(req, res){ - var fs = require('fs'); - // var ps = require("ps-node"); - var running = require("is-running"); - fs.readFile('/root/tagserver.pid', function (derr,ddata) { - if (derr) { - console.log("Problem getting PID of tagserver"); - res.json({status:"error", message: "Problem getting PID of tagserver"}); - } else { - res.json({status: "OK", running: running(ddata)}); - } - }); -}; - -exports.restartLogger = function(req, res){ - var exec = require('child_process').exec; - exec('/etc/init.d/loggers start', function(error, stdout, stderr){ - if (error){ - res.json({status:"error", message:error}); - } else { - res.json({status:"OK"}); - } - }); -}; - -exports.getSetup = function(req, res){ - var sqlite3 = require('sqlite3').verbose(); - var db = new sqlite3.Database(dbFile); - - var query = "SELECT parameter, val, dateAdded FROM config GROUP BY parameter;"; - var prepQuery = db.prepare(query); - prepQuery.all(req.params.id, function(err, rows) { - prepQuery.finalize(); - db.close(); - if (err) { - res.json({status:"error", message:err}); - console.log(err); - } else { - res.json({status:"OK", config:rows}); - } - }); -}; - -exports.updateSetup = function(req, res){ - var exec = require('child_process').exec; - var sqlite3 = require('sqlite3').verbose(); - var db = new sqlite3.Database(dbFile); - - console.log(req.body.parameter, req.body.val); - db.serialize(function(){ - var query = db.prepare('INSERT INTO config (parameter, val) VALUES (?, ?)'); - query.run(req.body.parameter, req.body.val, function(err) { - query.finalize(); - db.close(); - if (err) { - console.log({runErr:err}); - res.json({status:"error", message:err, query:query}); - } else { - res.redirect("/#/setup"); - exec('/etc/init.d/loggers stop', function(error, stdout, stderr){ - if (error){ - console.log({status:"error", message:error, query:query}); - } - setTimeout(function(){ - exec('/etc/init.d/loggers start', function(error, stdout, stderr){ - if (error){ - console.log({status:"error", message:error, query:query}); - } - }); - },5000); - }); - } - }); - }); -}; diff --git a/www/public/partials/dashboard.html b/www/public/partials/dashboard.html index ee75c16..48c7713 100644 --- a/www/public/partials/dashboard.html +++ b/www/public/partials/dashboard.html @@ -24,7 +24,7 @@ Download All Data