From 8a40417de976208ef82eff1712c60a1818e22524 Mon Sep 17 00:00:00 2001 From: Paul Trowbridge Date: Wed, 25 Mar 2020 23:30:25 -0400 Subject: [PATCH] work on turning into service --- cert.pem | 19 +++++++ create_certs.sh | 4 ++ index.js | 14 ++++- key.pem | 27 +++++++++ server.js | 142 +++++++++++++++++++++++------------------------ template.service | 13 +++++ 6 files changed, 143 insertions(+), 76 deletions(-) create mode 100644 cert.pem create mode 100644 create_certs.sh create mode 100644 key.pem create mode 100644 template.service diff --git a/cert.pem b/cert.pem new file mode 100644 index 0000000..dff3eec --- /dev/null +++ b/cert.pem @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDETCCAfkCFDygOtYyPxZgKLgMp/wIeQ2yGHweMA0GCSqGSIb3DQEBCwUAMEUx +CzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl +cm5ldCBXaWRnaXRzIFB0eSBMdGQwHhcNMjAwMzE3MDQ0MzI2WhcNNDcwODAyMDQ0 +MzI2WjBFMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UE +CgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAruKzxqy7Zdk1odLAtnKs60eu5/rLGMdsLjbB+V7R7v3bIdi/ +TaoKD0oYOHjJSEfpKUEqva+W45Yx8A9dt2OE2jD2Rr3sCNub6m2vY4iB9xXGA5Wy +qtMr83Die225TOtMgGnTmYIU2D7VfOZ08xFu4rwU6NlvjHx/xMByRQ7N1QAMmlkr +F1/KRd6i4+OmFoY81ErsLL4P/rhJ8jbzbRmJGzz3DGOXFvE9Qk+DdMxk8WnzfiZc +8HBVBMYPYifSvuoARtxigQOwodjOTrb+asw3AG5B4Yh1NnZMDa8ujaYgid0RiN8a +Y18GcXZmtGdl1h88Zmlv+sqJbSK5ThOj8pPsxQIDAQABMA0GCSqGSIb3DQEBCwUA +A4IBAQBpLPJ1YZYPERYPYQbczMgcv+GaT7mqJNo7ATAgvMQYIhk2PjbS1FU8+A1X +DBuSb4vfJ6C2zEAWoduncNbKXw4Q9UkZS6/fer8HS1oYOWe9gli/V+hisEPfF1DB +6jyvbp1PZYd39LccovQ9d1ujEOdch+I2iQP4BfpiQohXePDXJA1eDCg2kQBI7aAF +IQ9ZB4ywe6IivLsv1hM37EWEAf6/wO8k2HrZf+LvQAf+fuk/SIhNFav7oRg/FuBJ +p+56Itc8M+Qd6fIEFyj6GOAUhUzbuA1TH9h/XP6dmMk1XIWrFjhUQ4QC0scLdKTF ++xO3dWJaJnrTa+8Ex7KK6Akgo9rc +-----END CERTIFICATE----- diff --git a/create_certs.sh b/create_certs.sh new file mode 100644 index 0000000..a61257d --- /dev/null +++ b/create_certs.sh @@ -0,0 +1,4 @@ +openssl genrsa -out key.pem +openssl req -new -key key.pem -out csr.pem +openssl x509 -req -days 9999 -in csr.pem -signkey key.pem -out cert.pem +rm csr.pem \ No newline at end of file diff --git a/index.js b/index.js index 465b549..baf0735 100644 --- a/index.js +++ b/index.js @@ -1,2 +1,12 @@ -var server = require('./server'); -server.listen(80); \ No newline at end of file +//var server = require('./server'); +//server.listen(process.env.nodeport); + +var options = { + key: fs.readFileSync(process.env.wd + 'key.pem'), + cert: fs.readFileSync(process.env.wd + 'cert.pem'), + passprase: [] +}; + +https.createServer(options, server).listen(process.env.nodeport, () => { + console.log('started on ' + process.env.nodeport) +}); \ No newline at end of file diff --git a/key.pem b/key.pem new file mode 100644 index 0000000..fb44d47 --- /dev/null +++ b/key.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAruKzxqy7Zdk1odLAtnKs60eu5/rLGMdsLjbB+V7R7v3bIdi/ +TaoKD0oYOHjJSEfpKUEqva+W45Yx8A9dt2OE2jD2Rr3sCNub6m2vY4iB9xXGA5Wy +qtMr83Die225TOtMgGnTmYIU2D7VfOZ08xFu4rwU6NlvjHx/xMByRQ7N1QAMmlkr +F1/KRd6i4+OmFoY81ErsLL4P/rhJ8jbzbRmJGzz3DGOXFvE9Qk+DdMxk8WnzfiZc +8HBVBMYPYifSvuoARtxigQOwodjOTrb+asw3AG5B4Yh1NnZMDa8ujaYgid0RiN8a +Y18GcXZmtGdl1h88Zmlv+sqJbSK5ThOj8pPsxQIDAQABAoIBAF28hy1q8frSJIv7 +AW4JIyPsxRPz+Z3rbdGLaga2SwG1MRoAKfF/vWqahUbnfsNuP8vr8PPAxLhxjYyl +P88G2XN1oNsj+vp4cyaA6ewIg9ii5AKR3zTugPU3wTz0/8f5qoR9tHvoHDIX46fR +gkeyRWPj+bUgrkh3hqg3mkfnem26eQ7/lBLrwhscCqDnxg7CneoFfvdqdlYO1HTO +gU+zmwZ6LPXoeV2wQpJy0yf+FZkOd4mUiSlK5C+DMOrfjWcvdVG931h91xzQUHDh +MumjbEx5tSJXMeb4zXofBbPLUZZCHl4VkgY/C7JjG7KGrl/GN6aSkjfSCnzzBBrb +3B7lcKECgYEA20g9TfFMLp7rlaap5WAUh2wDgg7klIhLYlqx+No5YgAcnkC4ec6y +97CV9jrAdLzod9i0WVczN9d4dfA30vu45Vp9k6k+XUgnKe00PFAHQheAOY+yG+Am +KUxvjvVwHolYSTq+6dVbMAfN0rfiJgvABKuxTmdFEloQWlzMpG7Re+kCgYEAzCta +0NJEhDrgf7AUPDkeFx45ZmwcTIwGff5jOlr8WfW8/u24qRVrqnMc7JyA7Pub8NlX +b+tFMVUKfWTJbCnqOiwQjstuXrUUkL78vIBcAyETRrXln11kRM+/aOLWm3F9WgCR +qRqxEehSlpVjM3w98hLfElWjbjSMZekboNjvjH0CgYEAqoWexsHiUE7dPN8CN5Fj +5XulrroOH0Nt++ozhCWPgho8JwSFcJPAsMTtmTFPAHj2/lvSw7b/6WjyECTiBHwj +6JdaGD4AdWHqsrv3Zv+E5WyJFjocc3j3tB3wkudibRy5Pxkj5Ys5AjzPXhIJFzUD ++Z3an/HG0OKg3ORVb3mOBiECgYA9EEZ0KD9H0Rgt+GrE7Excm7SNNo5sMoEKk9f3 +rxjEiyPAlzbgk0CFVTJ0bgZ9Wm90ZHyrQ5GJRKcDg+5eRFcCmQVGv/89oikJdaW/ +dyCN6wmJ34NS26rOjdfwtc975ECad4sZKZuGAJca5Ikr79/TE+PV5vkfT+Yh4Mtb +myZiPQKBgHGM9ZSXCQRGeZqhbSZeXBC/oBSdI2+R8HSR9O7x9yLiRd5JGDJS82q9 +4aKQRCAGQ7AILEBmdwWXQuFqrroUYFWR+YYIGwBZhms1Fdcb1WvjV0Ag/GBce93x +XQgdFrcA0mZ5BUXR5MFPCOeYfi/d4GjQbMPls36tz7DnAFMHeKbF +-----END RSA PRIVATE KEY----- diff --git a/server.js b/server.js index 41d550c..2c9ff76 100644 --- a/server.js +++ b/server.js @@ -7,13 +7,15 @@ var mult = require('multer'); var upload = mult({ encoding: "utf8" }); var csvtojson = require('csvtojson'); var pg = require('pg'); +var https = require('https'); +var fs = require('fs'); +var readline = require('readline'); var server = express(); server.engine('handlebars', handlebars()); server.set('view engine', 'handlebars'); -server.use(function(inReq, inRes, inNext) -{ +server.use(function(inReq, inRes, inNext) { inRes.header("Access-Control-Allow-Origin", "*"); inRes.header("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS"); inRes.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); @@ -21,6 +23,17 @@ server.use(function(inReq, inRes, inNext) }); +var options = { + key: fs.readFileSync(process.env.wd + 'key.pem'), + cert: fs.readFileSync(process.env.wd + 'cert.pem'), + passprase: [] +}; + +https.createServer(options, server).listen(process.env.nodeport, () => { + console.log('started on ' + process.env.nodeport) +}); + + var Postgres = new pg.Client({ user: process.env.user, password: process.env.password, @@ -30,11 +43,9 @@ var Postgres = new pg.Client({ ssl: false, application_name: "tps_etl_api" }); -Postgres.FirstRow = function(inSQL,args, inResponse) -{ - Postgres.query(inSQL,args, (err, res) => { - if (err === null) - { +Postgres.FirstRow = function(inSQL, args, inResponse) { + Postgres.query(inSQL, args, (err, res) => { + if (err === null) { inResponse.json(res.rows[0]); return; } @@ -46,44 +57,40 @@ Postgres.connect(); //----------------------------------------------------------source definitions------------------------------------------------------------------------------------------------------------------------- //returns array of all sources -server.get("/source", function (inReq, inRes) -{ +server.get("/source", function(inReq, inRes) { var sql = "SELECT jsonb_agg(defn) source_list FROM tps.srce"; - Postgres.FirstRow(sql,[], inRes); + Postgres.FirstRow(sql, [], inRes); }); //returns message about status and error description -server.post("/source_single", bodyParser.json(), function (inReq, inRes)// remove body parsing, just pass post body to the sql string build -{ - var sql = "SELECT x.message FROM tps.srce_set($1::jsonb) as x(message)"; - Postgres.FirstRow(sql,[JSON.stringify(inReq.body)], inRes); -}); +server.post("/source_single", bodyParser.json(), function(inReq, inRes) // remove body parsing, just pass post body to the sql string build + { + var sql = "SELECT x.message FROM tps.srce_set($1::jsonb) as x(message)"; + Postgres.FirstRow(sql, [JSON.stringify(inReq.body)], inRes); + }); //assume inboud info is json array of definitions to set -server.post("/source", bodyParser.json(), function (inReq, inRes)// remove body parsing, just pass post body to the sql string build -{ - //x = inReq.body; - var sql = "SELECT x.message FROM tps.srce_overwrite_all($1::jsonb) x(message)"; - //console.log(JSON.stringify(inReq.body)); - Postgres.FirstRow(sql,[JSON.stringify(inReq.body)], inRes); -}); +server.post("/source", bodyParser.json(), function(inReq, inRes) // remove body parsing, just pass post body to the sql string build + { + //x = inReq.body; + var sql = "SELECT x.message FROM tps.srce_overwrite_all($1::jsonb) x(message)"; + //console.log(JSON.stringify(inReq.body)); + Postgres.FirstRow(sql, [JSON.stringify(inReq.body)], inRes); + }); //----------------------------------------------------------regex instrUctions------------------------------------------------------------------------------------------------------------------------- //list all regex operations -server.get("/regex", function (inReq, inRes) -{ +server.get("/regex", function(inReq, inRes) { var sql = "SELECT jsonb_agg(regex) regex FROM tps.map_rm WHERE srce = $1::text"; Postgres.FirstRow(sql, [inReq.query.srce], inRes); }); //set one or more map definitions -server.post("/regex", bodyParser.json(), function (inReq, inRes) -{ +server.post("/regex", bodyParser.json(), function(inReq, inRes) { var sql = "SELECT x.message FROM tps.srce_map_def_set($1::jsonb) as x(message)"; Postgres.FirstRow(sql, [JSON.stringify(inReq.body)], inRes); }); //takes an ad-hoc regex definition in curly braces -server.get("/regex_test", bodyParser.json(), function (inReq, inRes) -{ +server.get("/regex_test", bodyParser.json(), function(inReq, inRes) { var sql = "SELECT x.message FROM tps.test_regex_recs($1::jsonb) as x(message)"; Postgres.FirstRow(sql, [JSON.stringify(inReq.body)], inRes); }); @@ -91,49 +98,44 @@ server.get("/regex_test", bodyParser.json(), function (inReq, inRes) //------------------------------------------------------------mappings--------------------------------------------------------------------------------------------------------------------------------- //list unmapped items flagged to be mapped ?srce= -server.get("/unmapped_all", function (inReq, inRes) -{ +server.get("/unmapped_all", function(inReq, inRes) { var sql = "SELECT jsonb_agg(row_to_json(x)::jsonb) regex FROM tps.report_unmapped_recs($1::text) x"; - Postgres.FirstRow(sql,[inReq.query.srce], inRes); + Postgres.FirstRow(sql, [inReq.query.srce], inRes); }); //list unmapped items flagged to be mapped ?srce= -server.get("/unmapped", function (inReq, inRes) -{ +server.get("/unmapped", function(inReq, inRes) { var sql = "SELECT jsonb_agg(row_to_json(x)::jsonb) regex FROM tps.report_unmapped($1::text) x"; - Postgres.FirstRow(sql,[inReq.query.srce], inRes); + Postgres.FirstRow(sql, [inReq.query.srce], inRes); }); -server.get("/mapping", function (inReq, inRes) -{ +server.get("/mapping", function(inReq, inRes) { var sql = "SELECT jsonb_agg(row_to_json(x)::jsonb) regex FROM tps.map_rv x WHERE srce = $1::text"; - Postgres.FirstRow(sql,[inReq.query.srce], inRes); + Postgres.FirstRow(sql, [inReq.query.srce], inRes); }); //add entries to lookup table -server.post("/mapping", bodyParser.json(), function (inReq, inRes) -{ +server.post("/mapping", bodyParser.json(), function(inReq, inRes) { var sql = "SELECT x.message FROM tps.map_rv_set($1::jsonb) as x(message)"; - Postgres.FirstRow(sql,[JSON.stringify( inReq.body)], inRes); + Postgres.FirstRow(sql, [JSON.stringify(inReq.body)], inRes); }); //---------------------------------------------------------list imports-------------------------------------------------------------------------------------------------------------------------------- -server.get("/import_log", function (inReq, inRes) -{ +server.get("/import_log", function(inReq, inRes) { var sql = "SELECT jsonb_agg(row_to_json(l)::jsonb) regex FROM tps.trans_log l"; - Postgres.FirstRow(sql,[], inRes); + Postgres.FirstRow(sql, [], inRes); }); //-------------------------------------------------------------import data----------------------------------------------------------------------------------------------------------------------------- -server.use("/import", upload.single('upload'), function (inReq, inRes) { +server.use("/import", upload.single('upload'), function(inReq, inRes) { console.log("should have gotten file as post body here"); var csv = inReq.file.buffer.toString('utf8') - //{headers: "true", delimiter: ",", output: "jsonObj", flatKeys: "true"} + //{headers: "true", delimiter: ",", output: "jsonObj", flatKeys: "true"} csvtojson({ flatKeys: "true" }).fromString(csv).then( (x) => { var sql = "SELECT x.message FROM tps.srce_import($1, $2::jsonb) as x(message)" @@ -141,24 +143,22 @@ server.use("/import", upload.single('upload'), function (inReq, inRes) { Postgres.FirstRow(sql, [inReq.query.srce, JSON.stringify(x)], inRes); } ); - } -); +}); //----------------------------------------------------------list import logs--------------------------------------------------------------------------------------------------------------------------- -server.get("/import_log", function (inReq, inRes) -{ +server.get("/import_log", function(inReq, inRes) { var sql = "SELECT jsonb_agg(info) info FROM tps.trans_log WHERE info @> $1::jsonb"; Postgres.FirstRow(sql, [inReq.query], inRes); }); //-------------------------------------------------------------suggest source def---------------------------------------------------------------------------------------------------------------------- -server.use("/csv_suggest", upload.single('upload'), function (inReq, inRes) { +server.use("/csv_suggest", upload.single('upload'), function(inReq, inRes) { console.log("should have gotten file as post body here"); var csv = inReq.file.buffer.toString('utf8') - //{headers: "true", delimiter: ",", output: "jsonObj", flatKeys: "true"} + //{headers: "true", delimiter: ",", output: "jsonObj", flatKeys: "true"} csvtojson({ flatKeys: "true" }).fromString(csv).then( (x) => { var sug = { @@ -166,7 +166,7 @@ server.use("/csv_suggest", upload.single('upload'), function (inReq, inRes) { default: [] }, loading_function: "csv", - source:"client_file", + source: "client_file", name: "", constraint: [] }; @@ -175,14 +175,14 @@ server.use("/csv_suggest", upload.single('upload'), function (inReq, inRes) { //test if number if (!isNaN(parseFloat(x[0][key])) && isFinite(x[0][key])) { //if is a number but leading character is -0- then it's text - if (x[0][key].charAt(0) == "0"){ + if (x[0][key].charAt(0) == "0") { col["type"] = "text"; } //if number and leadign character is not 0 then numeric else { col["type"] = "numeric"; } - } + } //if can cast to a date within a hundred years its probably a date else if (Date.parse(x[0][key]) > Date.parse('1950-01-01') && Date.parse(x[0][key]) < Date.parse('2050-01-01')) { col["type"] = "date"; @@ -199,8 +199,7 @@ server.use("/csv_suggest", upload.single('upload'), function (inReq, inRes) { inRes.json(sug); } ); - } -); +}); //-------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -209,21 +208,20 @@ server.use("/csv_suggest", upload.single('upload'), function (inReq, inRes) { //add ledger array and create offset account for every line -server.get("/gl_mhi_multi_post", bodyParser.json(), function (inReq, inRes) -{ +server.get("/gl_mhi_multi_post", bodyParser.json(), function(inReq, inRes) { var l = 0; console.log(inReq.body); x = inReq.body; x.gl = {}; x.gl.lines = []; x.gl.jpath = []; - for (var i in x.item){ + for (var i in x.item) { //copy the current item to the gl array var line = x.item[i]; x.gl.lines.push(line); //build references to 'item' array var ref = []; - ref.push("{item,"+i+"}"); + ref.push("{item," + i + "}"); ref.push("{header}"); x.gl.jpath.push(ref); //copy the current item to the gl array again, but swap account with supplied 'account' in header @@ -236,37 +234,35 @@ server.get("/gl_mhi_multi_post", bodyParser.json(), function (inReq, inRes) } var sql = "INSERT INTO evt.bpr (bpr) SELECT $1"; console.log(JSON.stringify(x)); - Postgres.FirstRow(sql,[JSON.stringify(x)], inRes); + Postgres.FirstRow(sql, [JSON.stringify(x)], inRes); }); //add ledger array and create offset account for every line -server.get("/gl_mje_build", bodyParser.json(), function (inReq, inRes) -{ +server.get("/gl_mje_build", bodyParser.json(), function(inReq, inRes) { var l = 0; console.log(inReq.body); x = inReq.body; x.gl = {}; x.gl.lines = []; x.gl.jpath = []; - for (var i in x.items){ + for (var i in x.items) { //copy the current item to the gl array var line = x.items[i]; x.gl.lines.push(line); //build references to 'item' array var ref = []; - ref.push("{items,"+i+"}"); + ref.push("{items," + i + "}"); ref.push("{header}"); x.gl.jpath.push(ref); } var sql = "INSERT INTO evt.bpr (bpr) SELECT $1"; console.log(JSON.stringify(x)); - Postgres.FirstRow(sql,[JSON.stringify(x)], inRes); + Postgres.FirstRow(sql, [JSON.stringify(x)], inRes); }); //add ledger array and create offset account for total of all lines -server.get("/gl_mhi_single_build", bodyParser.json(), function (inReq, inRes) -{ +server.get("/gl_mhi_single_build", bodyParser.json(), function(inReq, inRes) { var l = 0; var tot = 0.00; var bomb = false; @@ -274,13 +270,12 @@ server.get("/gl_mhi_single_build", bodyParser.json(), function (inReq, inRes) x = inReq.body; //add GL array x.GL = []; - for (var i in x.item){ + for (var i in x.item) { var line = x.item[i]; if ((line.account != null) && (line.amount != null)) { - x.GL.push(line); + x.GL.push(line); tot = tot + (line.amount || 0); - } - else { + } else { bomb = true; } //add the whole line as-is @@ -296,8 +291,7 @@ server.get("/gl_mhi_single_build", bodyParser.json(), function (inReq, inRes) }); -server.get("/", function (inReq, inRes) -{ +server.get("/", function(inReq, inRes) { inRes.render("definition", { title: "definition", layout: "main" }); }); diff --git a/template.service b/template.service new file mode 100644 index 0000000..b7e5924 --- /dev/null +++ b/template.service @@ -0,0 +1,13 @@ +[Unit] +Description=forecast_api +After=network.target + +[Service] +ExecStart=/usr/bin/node //opt/forecast_api/index.js +Restart=always +User=fc_api +Environemnt=NODE_ENV=production +WorkingDirectory=//opt/forecast_api + +[Install] +WantedBy=multi-user.target \ No newline at end of file