diff --git a/www/app.coffee b/www/app.coffee new file mode 100644 index 0000000..1218e3e --- /dev/null +++ b/www/app.coffee @@ -0,0 +1,99 @@ +express = require('express') +path = require('path') +fs = require('fs') +logger = require('morgan') +methodOverride = require('method-override') +bodyParser = require('body-parser') +errorHandler = require('errorhandler') +app = express() +fns = undefined + +app.locals.DB_TYPE = 'MySQL' +# or "MySQL" + +###* +* Configuration +### + +if app.locals.DB_TYPE == 'MySQL' + fns = require('./functions_MySQL.coffee') + mysql = require('mysql') + db_config = + host: 'localhost' + user: 'website' + password: 'henrypump' + database: 'poconsole' + app.locals.pool = mysql.createPool(db_config) + + handleDisconnect = -> + console.log 'Handling db disconnect gracefully' + app.locals.db = mysql.createConnection(db_config) + app.locals.db.connect (err) -> + if err + console.log 'error when connecting to db:', err + setTimeout handleDisconnect, 2000 + return + app.locals.db.on 'error', (err) -> + console.log 'db error', err + if err.code == 'PROTOCOL_CONNECTION_LOST' + handleDisconnect() + else + throw err + return + return + handleDisconnect() +else + fns = require('./functions_SQLite.coffee') + +app.set 'port', process.env.PORT or 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 +### + +angular = (req, res) -> + res.render 'angularIndex' + return + +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 +server = app.listen(s_port, -> + host = server.address().address + port = server.address().port + console.log 'POConsole listening at http://%s:%s', host, port + return +) diff --git a/www/dbcreate_MySQL.sql b/www/dbcreate_MySQL.sql index df73678..3c2cda2 100644 --- a/www/dbcreate_MySQL.sql +++ b/www/dbcreate_MySQL.sql @@ -8,13 +8,17 @@ CREATE TABLE IF NOT EXISTS poconsole.tag_classes( CREATE TABLE IF NOT EXISTS poconsole.tags( id int(11) NOT NULL AUTO_INCREMENT, - name TEXT, + name varchar(128), class int(11), tag varchar(128), + description varchar(128), data_type varchar(32), change_threshold float, guarantee_sec integer(11), map_function varchar(64), + units varchar(64), + minExpected varchar(64), + maxExpected varchar(64),  deleted INT NULL DEFAULT 0, PRIMARY KEY (id) ); @@ -23,7 +27,7 @@ CREATE TABLE IF NOT EXISTS poconsole.tags( CREATE TABLE IF NOT EXISTS poconsole.tag_vals( id int(11) NOT NULL AUTO_INCREMENT, dtime datetime, - name varchar(128), + tagID int, val float, PRIMARY KEY (id) ); diff --git a/www/dbcreate_SQLite.sql b/www/dbcreate_SQLite.sql index 37c244e..c630197 100644 --- a/www/dbcreate_SQLite.sql +++ b/www/dbcreate_SQLite.sql @@ -1,7 +1,7 @@ CREATE TABLE IF NOT EXISTS tags ( id INTEGER PRIMARY KEY, - tagName TEXT, - vanityName TEXT, + tag TEXT, + name TEXT, description TEXT, units TEXT, minExpected REAL, diff --git a/www/functions_MySQL.coffee b/www/functions_MySQL.coffee new file mode 100644 index 0000000..cb7a125 --- /dev/null +++ b/www/functions_MySQL.coffee @@ -0,0 +1,380 @@ +# var dbFile = "/usr/db/data.db"; +dbFile = '/mnt/usb/data.db' +# var dbFile = '/Users/patrickjmcd/data.db'; + + +dString_to_sqlite = (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 + ### + + re = /(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})/ + fd = re.exec(dString) + if fd + sqliteString = '' + sqliteString.concat fd[1], '-', fd[2], '-', fd[3], ' ', fd[4], ':', fd[5], ':', fd[6] + else + null + + +sqlite_to_dString = (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 + ### + + re = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/ + fd = re.exec(sqliteDate) + if fd + dString = '' + dString.concat fd[1], fd[2], fd[3], '_', fd[4], fd[5], fd[6] + else + null + + +getAllTags = (callback) -> + query = 'SELECT * FROM tags WHERE deleted = 0' + req.app.locals.db.query query, (err, rows, fields) -> + if err + return callback(err, null) + console.log err + else + return callback(null, rows) + return + return + + +exports.getAllTags = (req, res) -> + query = 'SELECT * FROM tags WHERE deleted = 0' + req.app.locals.db.query query, (err, rows, fields) -> + if err + res.json + status: 'error' + message: err + console.log err + else + res.json + status: 'OK' + tags: rows + return + return + + +exports.createTag = (req, res) -> + query = 'INSERT INTO tags (tagName, units, minExpected, maxExpected, vanityName, description) VALUES (?, ?, ?, ?, ?, ?)' + req.app.locals.db.query query, [req.body.tagName, req.body.units, req.body.minExpected, req.body.maxExpected, req.body.vanityName, req.body.description], (err, results) -> + if err + res.json + status: 'error' + message: err + console.log err + else + res.json status: 'OK' + return + return + + +exports.getTag = (req, res) -> + query = 'SELECT * FROM tags WHERE id = ?' + req.app.locals.db.query query, [req.params.id], (err, rows) -> + if err + res.json + status: 'error' + message: err + console.log err + else + res.json + status: 'OK' + tags: rows + return + return + + +exports.updateTag = (req, res) -> + query = 'UPDATE tags set tagName = ?, units = ?, minExpected = ?, maxExpected = ?, vanityName = ?, description = ? WHERE id = ?' + req.app.locals.db.query query, [req.body.tagName, req.body.units, req.body.minExpected, req.body.maxExpected, req.body.vanityName, req.body.description, req.body.id], (err, results) -> + if err + res.json + status: 'error' + message: err + console.log err + else + res.json + status: 'OK' + return + return + +exports.deleteTag = (req, res) -> + query = 'UPDATE tags SET deleted = 1 WHERE id = ?' + req.app.locals.db.query query, [req.params.tag], (err, results) -> + if err + res.json + status: 'error' + message: err + console.log err + else + res.json + status: 'OK' + return + return + +exports.seriesTagValues = (req, res) -> + query = 'SELECT * FROM tag_vals WHERE tagID = ? AND dateAdded >= DATE_SUB(NOW(), INTERVAL 1 HOUR)' + req.app.locals.db.query query, [parseInt(req.params.tag)], (err, rows) -> + if err + console.log err + res.json + status: 'error' + message: err + query: query + else + res.json + status: 'OK' + tag: req.params.tag + vals: rows + return + return + +exports.seriesTagValuesBetween = (req, res) -> + query = 'SELECT * FROM tag_vals WHERE tagID = ? AND dtime >= ? AND dtime <= ?' + req.app.locals.db.query query, [parseInt(req.params.tag), dString_to_sqlite(req.params.startDatetime), dString_to_sqlite(req.params.endDatetime)], (err, rows) -> + 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 + return + return + +createCSVrow = (header, dataRow) -> + i = header.indexOf(dataRow.vanityName) + csvRow = dataRow.id.toString() + ',' + dataRow.dateAdded + ',' + if i >= 0 + j = 2 + while j < header.length + if j == i + csvRow = csvRow + dataRow.val.toString() + ',' + else + csvRow = csvRow + ',' + j++ + csvRow = csvRow.slice(0, -1) + '\u000d' + return csvRow + return + +exports.allDataCSV = (req, res) -> + query = 'SELECT v.id, t.vanityName, v.val, v.dateAdded FROM tags t JOIN tag_vals v ON t.id = v.tagID' + req.app.locals.db.query query, (err, rows) -> + if err + console.log err + res.json + status: 'error' + message: err + query: query + else + getAllTags (err, tags) -> + if err + console.log err + else + csvString = '' + da = [ + 'id' + 'DateAdded' + ] + tagVanityNames = tags.map((t) -> + t.vanityName + ) + h = da.concat(tagVanityNames) + console.log h + csvString = csvString + h.join(',') + '\u000d' + i = 0 + while i < rows.length + csvString = csvString + createCSVrow(h, rows[i]) + i++ + res.set 'Content-Type', 'text/csv' + res.set 'Content-Disposition', 'attachment;filename=tagdata.csv' + res.send csvString + return + return + return + +exports.seriesCSV = (req, res) -> + query = 'SELECT v.id, t.vanityName, v.val, v.dateAdded FROM tags t JOIN tag_vals v ON t.id = v.tagID WHERE tagID = ? AND v.dateAdded > DATETIME(\'now\', \'-1 HOUR\')' + req.app.locals.db.query query, [parseInt(req.params.tag)], (err, rows) -> + if err + console.log err + res.json + status: 'error' + message: err + query: query + else + csvString = '' + h = [ + 'id' + 'DateAdded' + rows[0].vanityName + ] + csvString = csvString + h.join(',') + '\u000d' + i = 0 + while i < rows.length + csvString = csvString + [ + rows[i].id + rows[i].dateAdded + rows[i].val + ].join(',') + '\u000d' + i++ + res.set 'Content-Type', 'text/csv' + res.set 'Content-Disposition', 'attachment;filename=tagdata.csv' + res.send csvString + return + return + +exports.seriesCSVBetween = (req, res) -> + query = 'SELECT v.id, t.vanityName, v.val, v.dateAdded FROM tags t JOIN tag_vals v ON t.id = v.tagID WHERE tagID = ? AND dateAdded >= DATETIME(?) AND dateAdded <= DATETIME(?)' + req.app.locals.db.query query, [parseInt(req.params.tag), dString_to_sqlite(req.params.startDatetime), dString_to_sqlite(req.params.endDatetime)], (err, rows) -> + if err + console.log err + res.json + status: 'error' + message: err + query: query + else + csvString = '' + h = [ + 'id' + 'DateAdded' + rows[0].vanityName + ] + csvString = csvString + h.join(',') + '\u000d' + i = 0 + while i < rows.length + csvString = csvString + [ + rows[i].id + rows[i].dateAdded + rows[i].val + ].join(',') + '\u000d' + i++ + res.set 'Content-Type', 'text/csv' + res.set 'Content-Disposition', 'attachment;filename=tagdata.csv' + res.send csvString + return + return + +exports.latestValueSingleTag = (req, res) -> + query = 'SELECT * FROM tag_vals WHERE id = (SELECT MAX(id) FROM tag_vals WHERE tagID = ?)' + req.app.locals.db.query query, [req.params.tag], (err, rows) -> + console.log rows + if err + res.json + status: 'error' + message: err + console.log err + else + res.json + status: 'OK' + tag_val: rows[0] + return + return + +exports.latestValueAllTags = (req, res) -> + query = 'SELECT t.tag as tagName, t.name as vanityName, 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.dtime as dtime FROM tag_vals v JOIN tags t ON v.tagID = t.id WHERE t.deleted = 0 GROUP BY v.tagID' + req.app.locals.db.query query, [req.params.id], (err, rows) -> + if err + res.json + status: 'error' + message: err + console.log err + else + res.json + status: 'OK' + vals: rows + return + return + +exports.checkLoggerStatus = (req, res) -> + fs = require('fs') + # var ps = require("ps-node"); + running = require('is-running') + fs.readFile '/root/tagserver.pid', (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) + return + return + +exports.restartLogger = (req, res) -> + exec = require('child_process').exec + exec '/etc/init.d/loggers start', (error, stdout, stderr) -> + if error + res.json + status: 'error' + message: error + else + res.json + status: 'OK' + return + return + +exports.getSetup = (req, res) -> + query = 'SELECT parameter, val, dateAdded FROM config GROUP BY parameter;' + req.app.locals.db.query query, [req.params.id], (err, rows) -> + if err + res.json + status: 'error' + message: err + console.log err + else + res.json + status: 'OK' + config: rows + return + return + +exports.updateSetup = (req, res) -> + exec = require('child_process').exec + query = 'INSERT INTO config (parameter, val) VALUES (?, ?)'; + req.app.locals.db.query query, [req.body.parameter, req.body.val], (err) -> + if err + console.log runErr: err + res.json + status: 'error' + message: err + query: query + else + res.redirect '/#/setup' + exec '/etc/init.d/loggers stop', (error, stdout, stderr) -> + if error + console.log + status: 'error' + message: error + query: query + setTimeout (-> + exec '/etc/init.d/loggers start', (error, stdout, stderr) -> + if error + console.log + status: 'error' + message: error + query: query + return + return + ), 5000 + return + return + return + return diff --git a/www/functions_MySQL.js b/www/functions_MySQL.js index 462ac2d..4d50eca 100644 --- a/www/functions_MySQL.js +++ b/www/functions_MySQL.js @@ -76,5 +76,5 @@ exports.allTags = function(req, res){ }; exports.allValues = function(req, res){ - res.json(status:"error", message:"not implemented"}); + res.json({status:"error", message:"not implemented"}); }; diff --git a/www/functions_SQLite.coffee b/www/functions_SQLite.coffee new file mode 100644 index 0000000..7c42f13 --- /dev/null +++ b/www/functions_SQLite.coffee @@ -0,0 +1,482 @@ +# var dbFile = "/usr/db/data.db"; +dbFile = '/mnt/usb/data.db' +# var dbFile = '/Users/patrickjmcd/data.db'; + + +dString_to_sqlite = (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 + ### + + re = /(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})/ + fd = re.exec(dString) + if fd + sqliteString = '' + sqliteString.concat fd[1], '-', fd[2], '-', fd[3], ' ', fd[4], ':', fd[5], ':', fd[6] + else + null + + +sqlite_to_dString = (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 + ### + + re = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/ + fd = re.exec(sqliteDate) + if fd + dString = '' + dString.concat fd[1], fd[2], fd[3], '_', fd[4], fd[5], fd[6] + else + null + + +getAllTags = (callback) -> + sqlite3 = require('sqlite3').verbose() + db = new (sqlite3.Database)(dbFile) + db.serialize -> + query = 'SELECT * FROM tags WHERE deleted = 0' + prepQuery = db.prepare(query) + prepQuery.all (err, rows) -> + prepQuery.finalize() + db.close() + if err + return callback(err, null) + console.log err + else + return callback(null, rows) + return + return + return + + +exports.getAllTags = (req, res) -> + sqlite3 = require('sqlite3').verbose() + db = new (sqlite3.Database)(dbFile) + db.serialize -> + query = 'SELECT * FROM tags WHERE deleted = 0' + prepQuery = db.prepare(query) + prepQuery.all (err, rows) -> + prepQuery.finalize() + db.close() + if err + res.json + status: 'error' + message: err + console.log err + else + res.json + status: 'OK' + tags: rows + return + return + return + + +exports.createTag = (req, res) -> + sqlite3 = require('sqlite3').verbose() + db = new (sqlite3.Database)(dbFile) + db.serialize -> + query = 'INSERT INTO tags (tagName, units, minExpected, maxExpected, vanityName, description) VALUES (?, ?, ?, ?, ?, ?)' + prepQuery = db.prepare(query) + prepQuery.run req.body.tagName, req.body.units, req.body.minExpected, req.body.maxExpected, req.body.vanityName, req.body.description, (err) -> + prepQuery.finalize() + db.close() + if err + res.json + status: 'error' + message: err + console.log err + else + res.json status: 'OK' + return + return + return + + +exports.getTag = (req, res) -> + sqlite3 = require('sqlite3').verbose() + db = new (sqlite3.Database)(dbFile) + db.serialize -> + query = 'SELECT * FROM tags WHERE id = ?' + prepQuery = db.prepare(query) + prepQuery.all req.params.id, (err, rows) -> + prepQuery.finalize() + db.close() + if err + res.json + status: 'error' + message: err + console.log err + else + res.json + status: 'OK' + tags: rows + return + return + return + + +exports.updateTag = (req, res) -> + sqlite3 = require('sqlite3').verbose() + db = new (sqlite3.Database)(dbFile) + db.serialize -> + query = 'UPDATE tags set tagName = ?, units = ?, minExpected = ?, maxExpected = ?, vanityName = ?, description = ? WHERE id = ?' + 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, (err) -> + prepQuery.finalize() + db.close() + if err + res.json + status: 'error' + message: err + console.log err + else + res.json + status: 'OK' + return + return + return + +exports.deleteTag = (req, res) -> + sqlite3 = require('sqlite3').verbose() + db = new (sqlite3.Database)(dbFile) + db.serialize -> + query = 'UPDATE tags SET deleted = 1 WHERE id = ?' + prepQuery = db.prepare(query) + prepQuery.run req.params.tag, (err) -> + prepQuery.finalize() + db.close() + if err + res.json + status: 'error' + message: err + console.log err + else + res.json + status: 'OK' + return + return + return + +exports.seriesTagValues = (req, res) -> + sqlite3 = require('sqlite3').verbose() + db = new (sqlite3.Database)(dbFile) + db.serialize -> + query = 'SELECT * FROM vals WHERE tagID = ? AND dateAdded > DATETIME(\'now\', \'-1 HOUR\')' + prepQuery = db.prepare(query) + prepQuery.all parseInt(req.params.tag), (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 + return + return + return + +exports.seriesTagValuesBetween = (req, res) -> + sqlite3 = require('sqlite3').verbose() + db = new (sqlite3.Database)(dbFile) + db.serialize -> + query = 'SELECT * FROM vals WHERE tagID = ? AND dateAdded >= DATETIME(?) AND dateAdded <= DATETIME(?)' + prepQuery = db.prepare(query) + prepQuery.all parseInt(req.params.tag), dString_to_sqlite(req.params.startDatetime), dString_to_sqlite(req.params.endDatetime), (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 + return + return + return + +createCSVrow = (header, dataRow) -> + i = header.indexOf(dataRow.vanityName) + csvRow = dataRow.id.toString() + ',' + dataRow.dateAdded + ',' + if i >= 0 + j = 2 + while j < header.length + if j == i + csvRow = csvRow + dataRow.val.toString() + ',' + else + csvRow = csvRow + ',' + j++ + csvRow = csvRow.slice(0, -1) + '\u000d' + return csvRow + return + +exports.allDataCSV = (req, res) -> + sqlite3 = require('sqlite3').verbose() + db = new (sqlite3.Database)(dbFile) + db.serialize -> + query = 'SELECT v.id, t.vanityName, v.val, v.dateAdded FROM tags t JOIN vals v ON t.id = v.tagID' + prepQuery = db.prepare(query) + prepQuery.all (err, rows) -> + prepQuery.finalize() + db.close() + if err + console.log err + res.json + status: 'error' + message: err + query: query + else + getAllTags (err, tags) -> + if err + console.log err + else + csvString = '' + da = [ + 'id' + 'DateAdded' + ] + tagVanityNames = tags.map((t) -> + t.vanityName + ) + h = da.concat(tagVanityNames) + console.log h + csvString = csvString + h.join(',') + '\u000d' + i = 0 + while i < rows.length + csvString = csvString + createCSVrow(h, rows[i]) + i++ + res.set 'Content-Type', 'text/csv' + res.set 'Content-Disposition', 'attachment;filename=tagdata.csv' + res.send csvString + return + return + return + return + +exports.seriesCSV = (req, res) -> + sqlite3 = require('sqlite3').verbose() + db = new (sqlite3.Database)(dbFile) + db.serialize -> + 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\')' + prepQuery = db.prepare(query) + prepQuery.all parseInt(req.params.tag), (err, rows) -> + prepQuery.finalize() + db.close() + if err + console.log err + res.json + status: 'error' + message: err + query: query + else + csvString = '' + h = [ + 'id' + 'DateAdded' + rows[0].vanityName + ] + csvString = csvString + h.join(',') + '\u000d' + i = 0 + while i < rows.length + csvString = csvString + [ + rows[i].id + rows[i].dateAdded + rows[i].val + ].join(',') + '\u000d' + i++ + res.set 'Content-Type', 'text/csv' + res.set 'Content-Disposition', 'attachment;filename=tagdata.csv' + res.send csvString + return + return + return + +exports.seriesCSVBetween = (req, res) -> + sqlite3 = require('sqlite3').verbose() + db = new (sqlite3.Database)(dbFile) + db.serialize -> + 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(?)' + prepQuery = db.prepare(query) + prepQuery.all parseInt(req.params.tag), dString_to_sqlite(req.params.startDatetime), dString_to_sqlite(req.params.endDatetime), (err, rows) -> + prepQuery.finalize() + db.close() + if err + console.log err + res.json + status: 'error' + message: err + query: query + else + csvString = '' + h = [ + 'id' + 'DateAdded' + rows[0].vanityName + ] + csvString = csvString + h.join(',') + '\u000d' + i = 0 + while i < rows.length + csvString = csvString + [ + rows[i].id + rows[i].dateAdded + rows[i].val + ].join(',') + '\u000d' + i++ + res.set 'Content-Type', 'text/csv' + res.set 'Content-Disposition', 'attachment;filename=tagdata.csv' + res.send csvString + return + return + return + +exports.latestValueSingleTag = (req, res) -> + sqlite3 = require('sqlite3').verbose() + db = new (sqlite3.Database)(dbFile) + db.serialize -> + query = 'SELECT * FROM vals WHERE id = (SELECT MAX(id) FROM vals WHERE tagID = ?)' + prepQuery = db.prepare(query) + prepQuery.all req.params.tag, (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] + return + return + return + +exports.latestValueAllTags = (req, res) -> + sqlite3 = require('sqlite3').verbose() + db = new (sqlite3.Database)(dbFile) + db.serialize -> + 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' + prepQuery = db.prepare(query) + prepQuery.all req.params.id, (err, rows) -> + prepQuery.finalize() + db.close() + if err + res.json + status: 'error' + message: err + console.log err + else + res.json + status: 'OK' + vals: rows + return + return + return + +exports.checkLoggerStatus = (req, res) -> + fs = require('fs') + # var ps = require("ps-node"); + running = require('is-running') + fs.readFile '/root/tagserver.pid', (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) + return + return + +exports.restartLogger = (req, res) -> + exec = require('child_process').exec + exec '/etc/init.d/loggers start', (error, stdout, stderr) -> + if error + res.json + status: 'error' + message: error + else + res.json + status: 'OK' + return + return + +exports.getSetup = (req, res) -> + sqlite3 = require('sqlite3').verbose() + db = new (sqlite3.Database)(dbFile) + query = 'SELECT parameter, val, dateAdded FROM config GROUP BY parameter;' + prepQuery = db.prepare(query) + prepQuery.all req.params.id, (err, rows) -> + prepQuery.finalize() + db.close() + if err + res.json + status: 'error' + message: err + console.log err + else + res.json + status: 'OK' + config: rows + return + return + +exports.updateSetup = (req, res) -> + exec = require('child_process').exec + sqlite3 = require('sqlite3').verbose() + db = new (sqlite3.Database)(dbFile) + console.log req.body.parameter, req.body.val + db.serialize -> + query = db.prepare('INSERT INTO config (parameter, val) VALUES (?, ?)') + query.run req.body.parameter, req.body.val, (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', (error, stdout, stderr) -> + if error + console.log + status: 'error' + message: error + query: query + setTimeout (-> + exec '/etc/init.d/loggers start', (error, stdout, stderr) -> + if error + console.log + status: 'error' + message: error + query: query + return + return + ), 5000 + return + return + return + return diff --git a/www/package.json b/www/package.json index d00fe55..df2d0bd 100644 --- a/www/package.json +++ b/www/package.json @@ -14,7 +14,8 @@ "serve-favicon": "*", "sqlite3": "*", "n3-charts": "*", - "is-running": "*" + "is-running": "*", + "coffee-script": "*" }, "devDependencies": {}, "scripts": { diff --git a/www/public/partials/tags.html b/www/public/partials/tags.html index 20195c5..9bc1303 100644 --- a/www/public/partials/tags.html +++ b/www/public/partials/tags.html @@ -9,12 +9,12 @@

{{message}}

- - + +
- - + +
@@ -53,12 +53,12 @@

{{message}}

- - + +
- - + +
@@ -96,7 +96,7 @@
- - -