orcinus
Version:
Container orchestration tools
207 lines (174 loc) • 5.71 kB
JavaScript
var package = require('./package.json');
var compression = require('compression');
var path = require('path');
var express = require('express');
var cors = require('cors');
var app = express();
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var url = require("url");
var colors = require('colors');
var passport = require('passport');
var orcinusd = require('orcinusd');
var db = require("./db");
var jwt = require('jsonwebtoken');
var authMW = express.Router();
module.exports = function(){
/*
Environment :
ORCINUS_HOST=<hostname>
ORCINUS_PORT=<port>
ORCINUS_HTTP_CORS= example : http://domain1.com, http://domain2.com or *
*/
var DEPLOYMENT = process.env.ORCINUS || "dev";
var PORT = process.env.ORCINUS_PORT || 4000;
var HOST = process.env.ORCINUS_HOST || "0.0.0.0";
var CORS = process.env.ORCINUS_HTTP_CORS || false;
var SOCK = process.env.ORCINUS_DOCKER_SOCKET || "/var/run/docker.sock";
var DBHOST = process.env.ORCINUS_DB || "orcinus-db/orcinus";
var OMURA = process.env.ORCINUS_OMURA || "omura.orcinus.id";
if(!process.env.ORCINUS_SECRET){
process.env.ORCINUS_SECRET = "orcinus"
}
var SECRET = process.env.ORCINUS_SECRET;
if(DEPLOYMENT === 'prod'){
process.env.NODE_ENV = production;
}
if(!process.env.ORCINUS_DOMAIN){
process.env.ORCINUS_DOMAIN = "svc.orcinus.id"
}
var ENDPOINT = process.env.ORCINUS_DOMAIN;
if(!process.env.ORCINUS_NETWORK){
process.env.ORCINUS_NETWORK = "orcinus"
}
var NETWORK = process.env.ORCINUS_NETWORK;
var ping = require("./apis/ping");
var info = require("./apis/info");
var cluster = require("./apis/cluster");
var service = require("./apis/service");
var stack = require("./apis/stack");
var task = require("./apis/task");
var volume = require("./apis/volume");
var container = require("./apis/container");
var auth = require("./apis/auth");
/*
* Database connection
*/
app.locals.orcinusdb = db(DBHOST);
db.users();
var corsOpt = {
"origin": false,
"methods": "GET,HEAD,PUT,PATCH,POST,DELETE",
"preflightContinue": false,
"optionsSuccessStatus": 204,
"allowedHeaders": ["Origin", "X-Requested-With", "Content-Type", "Accept", "Authorization", "x-access-token"]
}
if(CORS){
console.log(colors.yellow("==> HTTP CORS Active!"));
corsOpt = {
"origin": CORS,
"methods": "GET,HEAD,PUT,PATCH,POST,DELETE",
"preflightContinue": false,
"optionsSuccessStatus": 204,
"allowedHeaders": ["Origin", "X-Requested-With", "Content-Type", "Accept", "Authorization", "x-access-token"]
}
}
app.options('*', cors(corsOpt))
if(SOCK.indexOf("http") >= 0 || SOCK.indexOf("https") >= 0){
var sockParse = url.parse(SOCK);
var proto = sockParse.protocol.replace(":","");
var host = sockParse.hostname;
var port = sockParse.port;
SOCK = {protocol: proto, host: host, port: port};
}
else{
SOCK = { socketPath: SOCK };
}
if(DEPLOYMENT === 'dev'){
app.use(logger('dev'));
}
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(compression());
app.locals.orcinus = new orcinusd(SOCK);
app.locals.secret = SECRET;
app.use(express.static(path.join(__dirname, './www')));
app.use(passport.initialize());
app.get('/',function(req,res){
res.sendFile(path.join(__dirname, './www', 'index.html'));
});
/*
* Authentication
*/
// midleware
authMW.use(cors(corsOpt),function(req, res, next) {
// check header or url parameters or post parameters for token
var token = req.body.token || req.query.token || req.headers['x-access-token'];
// decode token
if (token) {
// verifies secret and checks exp
jwt.verify(token, SECRET, function(err, decoded) {
if (err) {
return res.status(403).json({ success: false, message: 'Failed to authenticate token.' });
} else {
// if everything is good, save to request for use in other routes
req.decoded = decoded;
next();
}
});
} else {
// if there is no token
// return an error
return res.status(403).send({
success: false,
message: 'No token provided.'
});
}
});
app.use('/apis/auth', cors(corsOpt), auth);
/*
* INFO
*/
app.use('/apis/info', cors(corsOpt), function(req, res, next) {
var info = {
name: package.name,
version: package.version,
description: package.description,
bugs: package.bugs,
repository: OMURA,
cors: corsOpt.origin,
deployment: DEPLOYMENT,
endpoint: ENDPOINT
}
res.send(info);
});
/*
* Apis router
*/
app.use('/apis/ping', authMW, ping);
app.use('/apis/info', authMW, info);
app.use('/apis/cluster', authMW, cluster);
app.use('/apis/service', authMW, service);
app.use('/apis/stack', authMW, stack);
app.use('/apis/task', authMW, task);
app.use('/apis/volume', authMW, volume);
app.use('/apis/container', authMW, container);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
res.sendFile(path.join(__dirname, './www', 'index.html'));
});
app.listen(parseInt(PORT), HOST, function(error) {
if (error) {
console.error(error);
} else {
console.info(colors.green("==> Listening on port %s. Visit http://%s:%s/ in your browser."), PORT,HOST, PORT);
}
});
return app;
}