diff --git a/nodejs/app.js b/nodejs/app.js
index 2a677ba..a979c16 100755
--- a/nodejs/app.js
+++ b/nodejs/app.js
@@ -7,12 +7,32 @@ const express = require('express');
// Set up the express app.
const app = express();
+// Hold list of functions to run when the server is ready
+app.onListen = [function(){console.log('hello')}];
+
// Allow the express app to be exported into other files.
module.exports = app;
// Build the conf object from the conf files.
app.conf = require('./conf/conf');
+// Grab the projects PubSub
+app.ps = require('./controller/pubsub.js');
+
+// Push pubsub over the socket and back.
+app.onListen.push(function(){
+ app.ps.subscribe(/./g, function(data, topic){
+ app.io.emit('P2PSub', { topic, data });
+ });
+
+ app.io.on('connection', (socket) => {
+ socket.on('P2PSub', (msg) => {
+ app.ps.publish(msg.topic, msg.data);
+ socket.broadcast.emit('P2PSub', msg);
+ });
+ });
+});
+
// Hold onto the auth middleware
const middleware = require('./middleware/auth');
@@ -38,6 +58,7 @@ app.use('/api/git', require('./routes/git_webhook.js'));
// API routes for working with users. All endpoints need to be have valid user.
app.use('/api/user', middleware.auth, require('./routes/user'));
+app.use('/api/repo', middleware.auth, require('./routes/repo'));
diff --git a/nodejs/bin/www b/nodejs/bin/www
index f9e8a58..a6540e8 100755
--- a/nodejs/bin/www
+++ b/nodejs/bin/www
@@ -22,6 +22,9 @@ app.set('port', port);
var server = http.createServer(app);
+var io = require('socket.io')(server);
+app.io = io;
+
/**
* Listen on provided port, on all network interfaces.
*/
@@ -87,5 +90,9 @@ function onListening() {
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
- debug('Listening on ' + bind);
+ console.log('Listening on ' + bind);
+
+ for(let listener of app.onListen){
+ listener()
+ }
}
diff --git a/nodejs/controller/pubsub.js b/nodejs/controller/pubsub.js
new file mode 100644
index 0000000..71764ce
--- /dev/null
+++ b/nodejs/controller/pubsub.js
@@ -0,0 +1,7 @@
+const {PubSub} = require('p2psub');
+
+ps = new PubSub();
+
+console.log(ps.subscribe())
+
+module.exports = ps;
diff --git a/nodejs/lib/deploy.js b/nodejs/lib/deploy.js
index ba8d169..a5e93c5 100644
--- a/nodejs/lib/deploy.js
+++ b/nodejs/lib/deploy.js
@@ -3,7 +3,7 @@ const extend = require('extend');
const axios = require('axios')
const {Repo, Environment, Deployment, Target} = require('../models/repo');
const deployTargets = require('./lxc');
-const conf = require('../conf/conf')
+const conf = require('../conf/conf');
async function doDeploy(action, repo, branch, repoSshurl, commit){
var deployment;
@@ -83,6 +83,7 @@ class Depoy{
}
async event(name, data){
+
console.log(`EVENT: ${name}`, data)
}
@@ -137,6 +138,10 @@ class Depoy{
async update(){
await this.exec(`
cd ${this.settings.workingPath};
+ git config --global user.email "you@example.com"
+ git config --global user.name "Your Name"
+ git stash
+
export GIT_SSH_COMMAND="/usr/bin/ssh -o StrictHostKeyChecking=no -i $HOME/.ssh/id_rsa_deploy_key"
git pull origin master;
./${this.settings.scriptsPath}/${this.environment.environment}/update.sh
@@ -237,16 +242,18 @@ module.exports = {doDeploy};
// for(let d of deployments){
// try{
// let lxc = new deployTargets.LXC({...{name: d.repo_env_id.replace('/', '_')}, ...d.target.settings})
- // await lxc.destroy();
- // await d.remove()
+ // console.log('deployment', d)
+ // // await lxc.destroy();
+ // console.log(await d.remove());
// }catch(error){
// console.log('err', error)
// }finally{
- // await d.remove()
+ // await d.remove();
// }
// }
+
}catch(error){
console.error('IIFE error:', error)
}})()
diff --git a/nodejs/middleware/auth.js b/nodejs/middleware/auth.js
index 808d57b..644f0f1 100755
--- a/nodejs/middleware/auth.js
+++ b/nodejs/middleware/auth.js
@@ -5,7 +5,6 @@ const {Auth} = require('../models/auth');
async function auth(req, res, next){
try{
let user = await Auth.checkToken({token: req.header('auth-token')});
-
if(user.uid){
req.user = user;
return next();
diff --git a/nodejs/models/auth.js b/nodejs/models/auth.js
index 690529e..317ae3b 100644
--- a/nodejs/models/auth.js
+++ b/nodejs/models/auth.js
@@ -35,6 +35,7 @@ Auth.checkToken = async function(data){
return await User.get(token.created_by);
}
}catch(error){
+ console.log('token error', data)
throw this.errors.login();
}
};
diff --git a/nodejs/models/repo.js b/nodejs/models/repo.js
index d369045..0296c46 100644
--- a/nodejs/models/repo.js
+++ b/nodejs/models/repo.js
@@ -109,7 +109,6 @@ class Environment extends Table{
'lastCommit': {default:"__NONE__", isRequired: false, type: 'string'},
'workingPath': {default: '/opt/datacom', type: 'string'},
'domain': {isRequired: true, type: 'string'},
-
}
static async add(data){
@@ -183,30 +182,30 @@ module.exports = {Repo, Environment, Deployment, Target};
// // To ssh://git.theta42.com:2222/wmantly/static-test.git
- let lxc_starting = await Target.add({
- created_by: 'wmantly',
- name: 'lxc_starting',
- type: 'LXC',
- settings: {
- user:'virt-service',
- host:'lxc-staging0.sfo2.do.datacominfra.net',
- keyPath:'/home/william/.ssh/id_rsa_virt-service'
- }
- });
+ // let lxc_staging = await Target.add({
+ // created_by: 'wmantly',
+ // name: 'lxc_staging',
+ // type: 'LXC',
+ // settings: {
+ // user:'virt-service',
+ // host:'lxc-staging0.sfo2.do.datacominfra.net',
+ // keyPath:'/home/william/.ssh/id_rsa_virt-service'
+ // }
+ // });
- var repo = await Repo.add({
- created_by: 'wmantly',
- repo: 'wmantly/static-test',
- })
+ // var repo = await Repo.add({
+ // created_by: 'wmantly',
+ // repo: 'wmantly/static-test',
+ // })
- var environment = await Environment.add({
- created_by: 'wmantly',
- environment: 'staging',
- branchMatch: '*',
- repo: 'wmantly/static-test',
- domain: '*.dc.vm42.us',
- target: 'lxc_starting'
- })
+ // var environment = await Environment.add({
+ // created_by: 'wmantly',
+ // environment: 'staging',
+ // branchMatch: '*',
+ // repo: 'wmantly/static-test',
+ // domain: '*.dc.vm42.us',
+ // target: 'lxc_staging'
+ // })
@@ -214,20 +213,20 @@ module.exports = {Repo, Environment, Deployment, Target};
// await environment.update({'domain': '*.dc.vm42.us'})
-// // console.log(test)
+ // console.log(test)
-// // console.log(await Environment.listDetail())
-// // let repo = await Repo.get('wmantly/test2')
-// // console.log(repo)
-// // repo.update({hookCallCount: 5});
-// // let envs = await repo.getEnvironments();
-// // let env = await repo.getEnvironmentsbyBranch('staging');
-// // let deployment = await env.addDeployment()
-// // console.log('deployment', deployment)
-// // let deployments = await repo.getDeploymentsbyBranch('staging')
-// // console.log('deployments', deployments)
-// // console.log('deployments', await Deployment.listDetail())
+ // console.log(await Environment.listDetail())
+ // let repo = await Repo.get('wmantly/static-test')
+ // console.log(repo)
+ // repo.update({hookCallCount: 5});
+ // let envs = await repo.getEnvironments();
+ // let env = await repo.getEnvironmentsbyBranch('staging');
+ // let deployment = await env.addDeployment()
+ // console.log('deployment', deployment)
+ // let deployments = await repo.getDeploymentsbyBranch('staging')
+ // console.log('deployments', deployments)
+ // console.log('deployments', await Deployment.listDetail())
@@ -251,6 +250,7 @@ module.exports = {Repo, Environment, Deployment, Target};
// console.log('deployments', deployment)
+ // console.log(await Repo.listDetail())
// return 0;
}catch(error){
diff --git a/nodejs/package-lock.json b/nodejs/package-lock.json
index 9aeb745..4d1bcd1 100644
--- a/nodejs/package-lock.json
+++ b/nodejs/package-lock.json
@@ -17,7 +17,9 @@
"moment": "^2.29.1",
"mustache": "^4.1.0",
"node-forge": "^0.10.0",
- "redis": "^2.8.0"
+ "p2psub": "^0.1.9",
+ "redis": "^2.8.0",
+ "socket.io": "^4.0.0"
},
"devDependencies": {
"nodemon": "^2.0.6"
@@ -52,6 +54,21 @@
"@types/node": "*"
}
},
+ "node_modules/@types/component-emitter": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz",
+ "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg=="
+ },
+ "node_modules/@types/cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg=="
+ },
+ "node_modules/@types/cors": {
+ "version": "2.8.10",
+ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz",
+ "integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ=="
+ },
"node_modules/@types/node": {
"version": "14.14.22",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.22.tgz",
@@ -203,6 +220,22 @@
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
},
+ "node_modules/base64-arraybuffer": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz",
+ "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/base64id": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
+ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
+ "engines": {
+ "node": "^4.5.0 || >= 5.9"
+ }
+ },
"node_modules/binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
@@ -422,7 +455,6 @@
"dependencies": {
"anymatch": "~3.1.1",
"braces": "~3.0.2",
- "fsevents": "~2.3.1",
"glob-parent": "~5.1.0",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
@@ -476,6 +508,11 @@
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
},
+ "node_modules/component-emitter": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
+ },
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -527,6 +564,18 @@
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
+ "node_modules/cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
"node_modules/crypto-random-string": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
@@ -649,6 +698,63 @@
"once": "^1.4.0"
}
},
+ "node_modules/engine.io": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.0.0.tgz",
+ "integrity": "sha512-BATIdDV3H1SrE9/u2BAotvsmjJg0t1P4+vGedImSs1lkFAtQdvk4Ev1y4LDiPF7BPWgXWEG+NDY+nLvW3UrMWw==",
+ "dependencies": {
+ "accepts": "~1.3.4",
+ "base64id": "2.0.0",
+ "cookie": "~0.4.1",
+ "cors": "~2.8.5",
+ "debug": "~4.3.1",
+ "engine.io-parser": "~4.0.0",
+ "ws": "~7.4.2"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/engine.io-parser": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz",
+ "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==",
+ "dependencies": {
+ "base64-arraybuffer": "0.1.4"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/engine.io/node_modules/cookie": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
+ "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/engine.io/node_modules/debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/engine.io/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
"node_modules/escape-goat": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
@@ -1389,6 +1495,14 @@
"node": ">=8"
}
},
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@@ -1418,6 +1532,11 @@
"node": ">=6"
}
},
+ "node_modules/p2psub": {
+ "version": "0.1.9",
+ "resolved": "https://registry.npmjs.org/p2psub/-/p2psub-0.1.9.tgz",
+ "integrity": "sha512-5za6YUq6GLH+iZCqOF7YaOd13joJyqJyjp/6o3wcy9hj969EJq7sJGsU5b3MB7tjMoaHAaIKZ01j99Y9QficUQ=="
+ },
"node_modules/package-json": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
@@ -1720,6 +1839,85 @@
"integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
"dev": true
},
+ "node_modules/socket.io": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.0.0.tgz",
+ "integrity": "sha512-/c1riZMV/4yz7KEpaMhDQbwhJDIoO55whXaRKgyEBQrLU9zUHXo9rzeTMvTOqwL9mbKfHKdrXcMoCeQ/1YtMsg==",
+ "dependencies": {
+ "@types/cookie": "^0.4.0",
+ "@types/cors": "^2.8.8",
+ "@types/node": ">=10.0.0",
+ "accepts": "~1.3.4",
+ "base64id": "~2.0.0",
+ "debug": "~4.3.1",
+ "engine.io": "~5.0.0",
+ "socket.io-adapter": "~2.2.0",
+ "socket.io-parser": "~4.0.3"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/socket.io-adapter": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.2.0.tgz",
+ "integrity": "sha512-rG49L+FwaVEwuAdeBRq49M97YI3ElVabJPzvHT9S6a2CWhDKnjSFasvwAwSYPRhQzfn4NtDIbCaGYgOCOU/rlg=="
+ },
+ "node_modules/socket.io-parser": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz",
+ "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==",
+ "dependencies": {
+ "@types/component-emitter": "^1.2.10",
+ "component-emitter": "~1.3.0",
+ "debug": "~4.3.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/socket.io-parser/node_modules/debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/socket.io-parser/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/socket.io/node_modules/debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/socket.io/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
"node_modules/statuses": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
@@ -2043,6 +2241,26 @@
"typedarray-to-buffer": "^3.1.5"
}
},
+ "node_modules/ws": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz",
+ "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==",
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
"node_modules/xdg-basedir": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
@@ -2077,6 +2295,21 @@
"@types/node": "*"
}
},
+ "@types/component-emitter": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz",
+ "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg=="
+ },
+ "@types/cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg=="
+ },
+ "@types/cors": {
+ "version": "2.8.10",
+ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz",
+ "integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ=="
+ },
"@types/node": {
"version": "14.14.22",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.22.tgz",
@@ -2206,6 +2439,16 @@
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
},
+ "base64-arraybuffer": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz",
+ "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI="
+ },
+ "base64id": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
+ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
+ },
"binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
@@ -2417,6 +2660,11 @@
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
},
+ "component-emitter": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
+ },
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -2456,6 +2704,15 @@
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
+ "cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "requires": {
+ "object-assign": "^4",
+ "vary": "^1"
+ }
+ },
"crypto-random-string": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
@@ -2554,6 +2811,48 @@
"once": "^1.4.0"
}
},
+ "engine.io": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.0.0.tgz",
+ "integrity": "sha512-BATIdDV3H1SrE9/u2BAotvsmjJg0t1P4+vGedImSs1lkFAtQdvk4Ev1y4LDiPF7BPWgXWEG+NDY+nLvW3UrMWw==",
+ "requires": {
+ "accepts": "~1.3.4",
+ "base64id": "2.0.0",
+ "cookie": "~0.4.1",
+ "cors": "~2.8.5",
+ "debug": "~4.3.1",
+ "engine.io-parser": "~4.0.0",
+ "ws": "~7.4.2"
+ },
+ "dependencies": {
+ "cookie": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
+ "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
+ },
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ }
+ }
+ },
+ "engine.io-parser": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz",
+ "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==",
+ "requires": {
+ "base64-arraybuffer": "0.1.4"
+ }
+ },
"escape-goat": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
@@ -3098,6 +3397,11 @@
"integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
"dev": true
},
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@@ -3121,6 +3425,11 @@
"integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
"dev": true
},
+ "p2psub": {
+ "version": "0.1.9",
+ "resolved": "https://registry.npmjs.org/p2psub/-/p2psub-0.1.9.tgz",
+ "integrity": "sha512-5za6YUq6GLH+iZCqOF7YaOd13joJyqJyjp/6o3wcy9hj969EJq7sJGsU5b3MB7tjMoaHAaIKZ01j99Y9QficUQ=="
+ },
"package-json": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
@@ -3361,6 +3670,67 @@
"integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
"dev": true
},
+ "socket.io": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.0.0.tgz",
+ "integrity": "sha512-/c1riZMV/4yz7KEpaMhDQbwhJDIoO55whXaRKgyEBQrLU9zUHXo9rzeTMvTOqwL9mbKfHKdrXcMoCeQ/1YtMsg==",
+ "requires": {
+ "@types/cookie": "^0.4.0",
+ "@types/cors": "^2.8.8",
+ "@types/node": ">=10.0.0",
+ "accepts": "~1.3.4",
+ "base64id": "~2.0.0",
+ "debug": "~4.3.1",
+ "engine.io": "~5.0.0",
+ "socket.io-adapter": "~2.2.0",
+ "socket.io-parser": "~4.0.3"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ }
+ }
+ },
+ "socket.io-adapter": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.2.0.tgz",
+ "integrity": "sha512-rG49L+FwaVEwuAdeBRq49M97YI3ElVabJPzvHT9S6a2CWhDKnjSFasvwAwSYPRhQzfn4NtDIbCaGYgOCOU/rlg=="
+ },
+ "socket.io-parser": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz",
+ "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==",
+ "requires": {
+ "@types/component-emitter": "^1.2.10",
+ "component-emitter": "~1.3.0",
+ "debug": "~4.3.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ }
+ }
+ },
"statuses": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
@@ -3605,6 +3975,12 @@
"typedarray-to-buffer": "^3.1.5"
}
},
+ "ws": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz",
+ "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==",
+ "requires": {}
+ },
"xdg-basedir": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
diff --git a/nodejs/package.json b/nodejs/package.json
index 3ecee17..dd130f0 100755
--- a/nodejs/package.json
+++ b/nodejs/package.json
@@ -20,7 +20,9 @@
"moment": "^2.29.1",
"mustache": "^4.1.0",
"node-forge": "^0.10.0",
- "redis": "^2.8.0"
+ "p2psub": "^0.1.9",
+ "redis": "^2.8.0",
+ "socket.io": "^4.0.0"
},
"license": "MIT",
"repository": {
diff --git a/nodejs/public/js/app.js b/nodejs/public/js/app.js
index 8baa0ac..7681359 100755
--- a/nodejs/public/js/app.js
+++ b/nodejs/public/js/app.js
@@ -1,5 +1,67 @@
var app = {};
+app.pubsub = (function(){
+ app.topics = {};
+
+ app.subscribe = function(topic, listener) {
+ if(topic instanceof RegExp){
+ listener.match = topic;
+ topic = "__REGEX__";
+ }
+
+ // create the topic if not yet created
+ if(!app.topics[topic]) app.topics[topic] = [];
+
+ // add the listener
+ app.topics[topic].push(listener);
+ }
+
+ app.matchTopics = function(topic){
+ topic = topic || '';
+ var matches = [... app.topics[topic] ? app.topics[topic] : []];
+
+ if(!app.topics['__REGEX__']) return matches;
+
+ for(var listener of app.topics['__REGEX__']){
+ if(topic.match(listener.match)) matches.push(listener);
+ }
+
+ return matches;
+ }
+
+ app.publish = function(topic, data) {
+
+ // send the event to all listeners
+ app.matchTopics(topic).forEach(function(listener) {
+ setTimeout(function(data, topic){
+ listener(data || {}, topic);
+ }, 0, data, topic);
+ });
+ }
+
+ return this;
+})(app);
+
+app.io = (function(app){
+ var socket = io();
+ // socket.emit('chat message', $('#m').val());
+ socket.on('P2PSub', function(msg){
+ msg.data.__noSocket = true;
+ app.publish(msg.topic, msg.data);
+ });
+
+ app.subscribe(/./g, function(data, topic){
+ // console.log('local_pubs', data, topic)
+ if(data.__noSocket) return;
+ // console.log('local_pubs 2', data, topic)
+
+ socket.emit('P2PSub', { topic, data })
+ });
+
+ return io;
+
+})(app);
+
app.api = (function(app){
var baseURL = '/api/'
@@ -108,6 +170,7 @@ app.auth = (function(app) {
function logIn(args, callack){
app.api.post('auth/login', args, function(error, data){
+ console.log('auth', data)
if(data.login){
setToken(data.token);
}
diff --git a/nodejs/routes/auth.js b/nodejs/routes/auth.js
index 41746b7..c3bd971 100755
--- a/nodejs/routes/auth.js
+++ b/nodejs/routes/auth.js
@@ -5,10 +5,11 @@ const {User} = require('../models/user');
const {Auth, AuthToken} = require('../models/auth');
+
+
router.post('/login', async function(req, res, next){
try{
let auth = await Auth.login(req.body);
- console.log('auth route', auth)
return res.json({
login: true,
token: auth.token.token,
diff --git a/nodejs/routes/git_webhook.js b/nodejs/routes/git_webhook.js
index 38d7bc6..b21c277 100644
--- a/nodejs/routes/git_webhook.js
+++ b/nodejs/routes/git_webhook.js
@@ -5,6 +5,9 @@ const {doDeploy} = require('../lib/deploy');
router.all('/', async function(req, res, next) {
try{
+
+ console.log(req.body)
+
var event = req.headers['x-github-event'];
var call = (req.body.created && 'create') ||
(req.body.deleted && 'delete') ||
@@ -15,7 +18,7 @@ router.all('/', async function(req, res, next) {
var commit = req.body.after;
let repo = req.body.repository.full_name;
- let id = await doDeploy('create', repo, branch, sshURL, commit);
+ // let id = await doDeploy('create', repo, branch, sshURL, commit);
res.json({id});
diff --git a/nodejs/routes/repo.js b/nodejs/routes/repo.js
new file mode 100644
index 0000000..c999894
--- /dev/null
+++ b/nodejs/routes/repo.js
@@ -0,0 +1,75 @@
+'use strict';
+
+const router = require('express').Router();
+const {Repo} = require('../models/repo');
+
+const Model = Repo;
+
+
+router.get('/', async function(req, res, next){
+ try{
+ return res.json({
+ hosts: await Model[req.query.detail ? "listDetail" : "list"]()
+ });
+ }catch(error){
+ return next(error);
+ }
+});
+
+router.post('/', async function(req, res, next){
+ try{
+ req.body.created_by = req.user.username;
+ await Model.add(req.body);
+
+ return res.json({
+ message: `"${req.body.host}" added.`
+ });
+ } catch (error){
+ return next(error);
+ }
+});
+
+router.get('/:item(*)', async function(req, res, next){
+ try{
+
+ return res.json({
+ item: req.params.item,
+ results: await Model.get(req.params.item)
+ });
+ }catch(error){
+ return next(error);
+ }
+});
+
+router.put('/:item(*)', async function(req, res, next){
+ try{
+ req.body.updated_by = req.user.username;
+ let item = await Model.get(req.params.item);
+ await item.update.call(item, req.body);
+
+ return res.json({
+ message: `"${req.params.item}" updated.`
+ });
+
+ }catch(error){
+ return next(error);
+
+ }
+});
+
+router.delete('/:item(*)', async function(req, res, next){
+ try{
+ let item = await Model.get(req.params);
+ let count = await host.remove.call(item, item);
+
+ return res.json({
+ message: `${req.params.host} deleted`,
+ });
+
+ }catch(error){
+ return next(error);
+ }
+});
+
+
+module.exports = router;
diff --git a/nodejs/routes/token.js b/nodejs/routes/token.js
deleted file mode 100644
index deac9df..0000000
--- a/nodejs/routes/token.js
+++ /dev/null
@@ -1,63 +0,0 @@
-'use strict';
-
-const router = require('express').Router();
-const {AuthToken} = require('../models/auth');
-const {Token, InviteToken} = require('../models/token');
-
-const tokens = {
- auth: AuthToken,
- invite: InviteToken
-}
-
-router.get('/:name', async function(req, res, next){
- try{
- console.log(tokens, req.params.name)
-
- return res.json({
- results: await tokens[req.params.name][req.query.detail ? "listDetail" : "list"]()
- });
- }catch(error){
- next(error);
- }
-});
-
-
-router.get('/:name/:token', async function(req, res, next){
- try{
- return res.json({
- results: await tokens[req.params.name].get(req.params.token)
- });
- }catch(error){
- next(error);
- }
-});
-
-// router.delete('/:username', async function(req, res, next){
-// try{
-// let user = await User.get(req.params.username);
-
-// return res.json({username: req.params.username, results: await user.remove()})
-// }catch(error){
-// next(error);
-// }
-// });
-
-module.exports = router;
-
-/*
- verify public ssh key
-*/
-// router.post('/verifykey', async function(req, res){
-// let key = req.body.key;
-
-// try{
-// return res.json({
-// info: await Users.verifyKey(key)
-// });
-// }catch(error){
-// return res.status(400).json({
-// message: 'Key is not a public key file!'
-// });
-// }
-
-// });
\ No newline at end of file
diff --git a/nodejs/routes/user.js b/nodejs/routes/user.js
index 3c5aa0d..3ede79c 100755
--- a/nodejs/routes/user.js
+++ b/nodejs/routes/user.js
@@ -5,63 +5,34 @@ const {User} = require('../models/user');
const {Auth, AuthToken} = require('../models/auth');
-router.post('/login', async function(req, res, next){
+router.get('/', async function(req, res, next){
try{
- let auth = await Auth.login(req.body);
return res.json({
- login: true,
- token: auth.token.token,
+ results: await User[req.query.detail ? "listDetail" : "list"]()
});
}catch(error){
next(error);
}
});
-router.all('/logout', async function(req, res, next){
+router.get('/me', async function(req, res, next){
try{
- if(req.user){
- await req.user.logout();
- }
- res.json({message: 'Bye'})
+ return res.json(await User.get({uid: req.user.uid}));
}catch(error){
next(error);
}
});
-router.post('/invite/:token', async function(req, res, next) {
+
+router.get('/:uid', async function(req, res, next){
try{
- req.body.token = req.params.token;
- let user = await User.addByInvite(req.body);
- let token = await AuthToken.add(user);
-
return res.json({
- user: user.username,
- token: token.token
+ results: await User.get(req.params.uid),
});
-
}catch(error){
next(error);
}
-
});
module.exports = router;
-
-/*
- verify public ssh key
-*/
-// router.post('/verifykey', async function(req, res){
-// let key = req.body.key;
-
-// try{
-// return res.json({
-// info: await Users.verifyKey(key)
-// });
-// }catch(error){
-// return res.status(400).json({
-// message: 'Key is not a public key file!'
-// });
-// }
-
-// });
\ No newline at end of file
diff --git a/nodejs/utils/redis_model.js b/nodejs/utils/redis_model.js
index 30cb36d..4453be4 100644
--- a/nodejs/utils/redis_model.js
+++ b/nodejs/utils/redis_model.js
@@ -14,6 +14,10 @@ class Table{
static async get(index){
try{
+ if(typeof index === 'object'){
+ index = index[this._key]
+ }
+
let result = await client.HGETALL(`${this.prototype.constructor.name}_${index}`);
if(!result){
diff --git a/nodejs/views/top.ejs b/nodejs/views/top.ejs
index 8eca685..cd1eebb 100755
--- a/nodejs/views/top.ejs
+++ b/nodejs/views/top.ejs
@@ -8,6 +8,7 @@
+