aggregation-platform/gulpfile.js

727 lines
24 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

var gulp = require('gulp'),
wiredep = require('wiredep').stream,
eventStream = require('event-stream'),
gulpLoadPlugins = require('gulp-load-plugins'),
fs = require('fs'),
path = require('path'),
url = require('url'),
uri = require('urijs'),
urljoin = require('url-join'),
s = require('underscore.string'),
stringifyObject = require('stringify-object'),
hawtio = require('hawtio-node-backend'),
argv = require('yargs').argv,
del = require('del'),
xml2js = require('xml2js'),
multipart = require('connect-multiparty'),
resumable = require('./app/resumable-node.js')(__dirname + '/uploads'),
app = hawtio.app,
shellprocess = require('child_process'),
xmloperation = require('./app/xmloperation'),
rootdir = process.env.STORAGE_PATH || '/home/server_data/',
K8s = require('k8s'),
crontab = require('node-crontab'),
myjs=require('./app/my.js');
var oracledb = require('oracledb');
var plugins = gulpLoadPlugins({});
var pkg = require('./package.json');
var time =0;
var schedule = [];
var kubectl = K8s.kubectl({
endpoint: process.env.KUBERNETES_MASTER,
binary: '/usr/bin/kubectl'
});
var config = {
main: '.',
ts: ['plugins/**/*.ts'],
less: ['plugins/**/*.less'],
templates: ['plugins/**/*.html'],
templateModule: pkg.name + '-templates',
dist: argv.out || './dist/',
js: pkg.name + '.js',
css: pkg.name + '.css',
tsProject: plugins.typescript.createProject({
target: 'ES5',
module: 'commonjs',
declarationFiles: true,
noExternalResolve: false
})
};
gulp.task('bower', function() {
return gulp.src('index.html')
.pipe(wiredep({}))
.pipe(gulp.dest('.'));
});
/** Adjust the reference path of any typescript-built plugin this project depends on */
gulp.task('path-adjust', function() {
return gulp.src('libs/**/includes.d.ts')
.pipe(plugins.replace(/"\.\.\/libs/gm, '"../../../libs'))
.pipe(gulp.dest('libs'));
});
gulp.task('clean-defs', function() {
return del('defs.d.ts');
});
gulp.task('tsc', ['clean-defs'], function() {
var cwd = process.cwd();
var tsResult = gulp.src(config.ts)
.pipe(plugins.sourcemaps.init())
.pipe(plugins.typescript(config.tsProject))
.on('error', plugins.notify.onError({
message: '<%= error.message =>',
title: 'Typescript compilation error'
}));
return eventStream.merge(
tsResult.js
.pipe(plugins.concat('compiled.js'))
.pipe(plugins.sourcemaps.write())
.pipe(gulp.dest('.')),
tsResult.dts
.pipe(gulp.dest('d.ts')))
.pipe(plugins.filter('**/*.d.ts'))
.pipe(plugins.concatFilenames('defs.d.ts', {
root: cwd,
prepend: '/// <reference path="',
append: '"/>'
}))
.pipe(gulp.dest('.'));
});
gulp.task('less', function () {
return gulp.src(config.less)
.pipe(plugins.less({
paths: [ path.join(__dirname, 'less', 'includes') ]
}))
.on('error', plugins.notify.onError({
message: '<%= error.message %>',
title: 'less file compilation error'
}))
.pipe(plugins.concat(config.css))
.pipe(gulp.dest(config.dist));
});
gulp.task('template', ['tsc'], function() {
return gulp.src(config.templates)
.pipe(plugins.angularTemplatecache({
filename: 'templates.js',
root: 'plugins/',
standalone: true,
module: config.templateModule,
templateFooter: '}]); hawtioPluginLoader.addModule("' + config.templateModule + '");'
}))
.pipe(gulp.dest('.'));
});
gulp.task('concat', ['template'], function() {
return gulp.src(['compiled.js', 'templates.js'])
.pipe(plugins.concat(config.js))
.pipe(plugins.ngAnnotate())
.pipe(gulp.dest(config.dist));
});
gulp.task('clean', ['concat'], function() {
return del(['templates.js', 'compiled.js', './site/']);
});
gulp.task('watch-less', function() {
plugins.watch(config.less, function() {
gulp.start('less');
});
});
gulp.task('watch', ['build', 'watch-less'], function() {
plugins.watch(['libs/**/*.js', 'libs/**/*.css', 'index.html', config.dist + '/*'], function() {
gulp.start('reload');
});
plugins.watch(['libs/**/*.d.ts', config.ts, config.templates], function() {
gulp.start(['tsc', 'template', 'concat', 'clean']);
});
});
gulp.task('connect', ['watch'], function() {
// lets disable unauthorised TLS issues with kube REST API
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
var kubeBase = process.env.KUBERNETES_MASTER || 'https://localhost:8443';
console.log("==== using KUBERNETES URL: " + kubeBase);
var kube = uri(urljoin(kubeBase, 'api'));
var oapi = uri(urljoin(kubeBase, 'oapi'));
console.log("Connecting to Kubernetes on: " + kube);
var staticAssets = [{
path: '/',
dir: '.'
}];
var dirs = fs.readdirSync('./libs');
dirs.forEach(function(dir) {
var dir = './libs/' + dir;
console.log("dir: ", dir);
if (fs.statSync(dir).isDirectory()) {
console.log("Adding directory to search path: ", dir);
staticAssets.push({
path: '/',
dir: dir
});
}
});
var localProxies = [];
if (process.env.LOCAL_APP_LIBRARY === "true") {
localProxies.push({
proto: "http",
port: "8588",
hostname: "localhost",
path: '/api/v1/proxy/namespaces/default/services/app-library',
targetPath: "/"
});
console.log("because of $LOCAL_APP_LIBRARY being true we are using a local proxy for /api/v1/proxy/namespaces/default/services/app-library" );
}
if (process.env.LOCAL_FABRIC8_FORGE === "true") {
localProxies.push({
proto: "http",
port: "8080",
hostname: "localhost",
path: '/api/v1/proxy/namespaces/default/services/fabric8-forge',
targetPath: "/"
});
console.log("because of LOCAL_FABRIC8_FORGE being true we are using a local proxy for /api/v1/proxy/namespaces/default/services/fabric8-forge" );
}
if (process.env.LOCAL_GOGS_HOST) {
var gogsPort = process.env.LOCAL_GOGS_PORT || "3000";
//var gogsHostName = process.env.LOCAL_GOGS_HOST + ":" + gogsPort;
var gogsHostName = process.env.LOCAL_GOGS_HOST;
console.log("Using gogs host: " + gogsHostName);
localProxies.push({
proto: "http",
port: gogsPort,
hostname: gogsHostName,
path: '/kubernetes/api/v1/proxy/services/gogs-http-service',
targetPath: "/"
});
console.log("because of LOCAL_GOGS_HOST being set we are using a local proxy for /kubernetes/api/v1/proxy/services/gogs-http-service to point to http://"
+ process.env.LOCAL_GOGS_HOST + ":" + gogsPort);
}
var defaultProxies = [{
proto: kube.protocol(),
port: kube.port(),
hostname: kube.hostname(),
path: '/kubernetes/api',
targetPath: kube.path()
}, {
proto: oapi.protocol(),
port: oapi.port(),
hostname: oapi.hostname(),
path: '/kubernetes/oapi',
targetPath: oapi.path()
}, {
proto: kube.protocol(),
hostname: kube.hostname(),
port: kube.port(),
path: '/jolokia',
targetPath: '/hawtio/jolokia'
}, {
proto: kube.protocol(),
hostname: kube.hostname(),
port: kube.port(),
path: '/git',
targetPath: '/hawtio/git'
}];
var staticProxies = localProxies.concat(defaultProxies);
hawtio.setConfig({
port: process.env.DEV_PORT || 9000,
staticProxies: staticProxies,
staticAssets: staticAssets,
fallback: 'index.html',
liveReload: {
enabled: true
}
});
var debugLoggingOfProxy = process.env.DEBUG_PROXY === "true";
var useAuthentication = process.env.DISABLE_OAUTH !== "true";
var googleClientId = process.env.GOOGLE_OAUTH_CLIENT_ID;
var googleClientSecret = process.env.GOOGLE_OAUTH_CLIENT_SECRET;
hawtio.use('/osconsole/config.js', function(req, res, next) {
var config = {
api: {
openshift: {
proto: oapi.protocol(),
hostPort: oapi.host(),
prefix: oapi.path()
},
k8s: {
proto: kube.protocol(),
hostPort: kube.host(),
prefix: kube.path()
}
}
};
if (googleClientId && googleClientSecret) {
config.master_uri = kubeBase;
config.google = {
clientId: googleClientId,
clientSecret: googleClientSecret,
authenticationURI: "https://accounts.google.com/o/oauth2/auth",
authorizationURI: "https://accounts.google.com/o/oauth2/auth",
scope: "profile",
redirectURI: "http://localhost:9000"
};
} else if (useAuthentication) {
config.master_uri = kubeBase;
config.openshift = {
oauth_authorize_uri: urljoin(kubeBase, '/oauth/authorize'),
oauth_client_id: 'fabric8'
};
}
var answer = "window.OPENSHIFT_CONFIG = " + stringifyObject(config);
res.set('Content-Type', 'application/javascript');
res.send(answer);
});
app.use(multipart());
hawtio.use('/', function(req, res, next) {
// console.log(req.connection.remoteAddress);
var path = req.originalUrl;
// avoid returning these files, they should get pulled from js
if (s.startsWith(path, '/plugins/') && s.endsWith(path, 'html')) {
console.log("returning 404 for: ", path);
res.statusCode = 404;
res.end();
} else {
if (debugLoggingOfProxy) {
console.log("allowing: ", path);
}
next();
}
});
hawtio.use('/xmlformserver',function(req,res,next){
if(req.method=='POST') {
var data = [];
var parser = new xml2js.Parser();
fs.readFile(rootdir + 'data.xml', function(err, xml) {
parser.parseString(xml, function (err, result) {
myjs.Recursion(result.node);
data.push(result.node);
res.send(data);
});
});
}
});
hawtio.use("/oracleAppPath",function(req,res){
var dataPath = "/home/ubuntu/data/";
var tmpPath = "/home/ubuntu/tmp/app";
var appSource="/home/app";
if(req.method="POST"){
var timestamp=new Date();
if((timestamp.getTime() - time) >= 2*60*1000){
time = timestamp.getTime();
var id =fs.readFileSync("./app/version.txt");
var dirName= "huizongshuju-" +id;
dataPath = dataPath + dirName+"/";
fs.mkdirSync(dataPath);
//path.exists(tmpPath,function(exists){if(exists) console.log("exists");});
fs.renameSync(tmpPath, dataPath+"app");
console.log("move 'home/ubuntu/tmp/app' to " + dataPath);
xmloperation.savehuizong(timestamp.Format('yyyy-MM-dd hh:mm:ss'), '10', id, "汇总数据库("+ id +")", dataPath, dirName);
fs.writeFileSync('./app/version.txt', 2);
res.send(200,{path: dataPath+"app/", name: dirName});
res.end();
shellprocess.exec("cp -rp " + appSource + " " + tmpPath);
}else{
res.send(403,{});
res.end();
}
}
//}
});
hawtio.use('/uploadfiles',function(req,res){
if(req.method==="POST"){
var relativePath = req.body.resumableRelativePath;
var fileName = req.body.resumableFilename;
var rootpath = req.body.resumableRootPath;
console.log("--------------------------req.body-----------------");
if(req.body.resumableTotalSize == "0"){
fs.writeFile("uploads/"+fileName,"");
// 去掉系统路径(地区及系统编号)eg: 321100_1/
relativePath = relativePath.replace(/^\w*\/*[0-9_]+\//, "");
console.log("*************-----clean------*****************");
var serverRelativePath = rootdir + rootpath + relativePath;
console.log(serverRelativePath);
fileName = "uploads/"+fileName;
console.log(fileName);
changefilename(fileName, serverRelativePath);
}
resumable.post(req, function(status, filename, original_filename, identifier){
if (status === 'done') {
var stream = fs.createWriteStream('./uploads/' + filename);
console.log("//ºÏ²¢Îļþ");
//ºÏ²¢Îļþ
resumable.write(identifier, stream);
stream.on('data', function(data){});
stream.on('end', function(){});
//ɾ³ý·Ö¿é
//µÈ´ýÁ÷½áÊø
stream.on('finish', function() {
console.log("*************-----clean------*****************");
// 去掉系统路径(地区及系统编号)eg: 321100_1/
relativePath = relativePath.replace(/^\w*\/*[0-9_]+\//, "");
relativePath = rootdir+ rootpath + relativePath;
console.log(relativePath);
fileName = "uploads/"+fileName;
console.log(fileName);
changefilename(fileName, relativePath);
resumable.clean(identifier);
});
}
console.log(status + "---------------------");
res.send(200, {
// NOTE: Uncomment this funciton to enable cross-domain request.
//'Access-Control-Allow-Origin': '*'
});
});
}
if(req.method==="GET"){
resumable.get(req, function(status, filename, original_filename, identifier){
console.log('GET',status);
res.send((status == 'found' ? 200 : 404), status);
});
}
//next();
});
hawtio.use('/download/:identifier', function(req, res){
resumable.write(req.params.identifier, res);
});
app.get('/getclientip', function(req, res){
var ip = req.connection.remoteAddress;
ip = ip.replace(/\./gim, "");
ip = ip.replace(/\:/gim, "");
res.send(ip);
});
app.get('/getversion', function(req, res){
var version = req.query;
var objid = version.id;
var realversion = xmloperation.getVersionPath(objid);
res.send(200, {id:realversion});
});
app.get('/sendDateMessage', function(req, res){
var jsonobj = req.query;
console.log("---------------------------------------------------");
console.log(jsonobj);
var objid = jsonobj.id;
var objname = jsonobj.name;
var objcity = jsonobj.city;
var objcounty = jsonobj.county;
var objsystem = jsonobj.system;
var objtype = jsonobj.type;
var objbatch = jsonobj.batch;
var province = jsonobj.province;
var code = jsonobj.code;
var character_set = jsonobj.character_set;
var sys_name_code = jsonobj.sys_name_code;
var contact = jsonobj.contact;
var phone = jsonobj.phone;
var collecttime = jsonobj.date;
var realversion = xmloperation.getVersionPath(objid);
var realpath = objtype+"/"+objbatch+"/"+objid+"/"+realversion+"/"
realpath = rootdir + realpath;
//saveByIdToXml("001001", "B", "321200_0", "泰州市_绩效管理系统2","江苏" , "泰州2", "市本级", "绩效管理系统", "321200_0", "0000", "lim", "13323225656",5);
xmloperation.saveByIdToXml(collecttime, objtype, objbatch, objid, objname, province, objcity, objcounty, objsystem, code, sys_name_code, contact, phone, realversion, realpath)
xmloperation.mkdataForPage(collecttime, objtype, realpath, objbatch, objid, objname, realversion);
res.send(200);
});
// 路径必须存在
function changefilename(oldfilepath, newfilepath){
fs.stat(oldfilepath,function(err,stats){
if(err){
changefilename(oldfilepath, newfilepath);
}
else{
//console.log("-------------------------------changefilename----");
if(stats.isFile()){
// 修改文件名
fs.rename(oldfilepath,newfilepath, function(err){
if(err){
var dirs = newfilepath.split("/");
var dirLength = dirs.length;
var dirpath = "";
//var isSuccess = "false";
for(var i=0; i < dirLength-1; i++){
dirpath = dirpath + dirs[i] + "/";
fs.mkdir(dirpath, 0777, function(err){
if(err){
//console.log("creat dir fail: "+dirpath);
}
});
}
changefilename(oldfilepath, newfilepath)
}
});
}else if(stats.isDirectory()){
var dirs = newfilepath.split("/");
var dirLength = dirs.length;
var dirpath = "";
for(var i=0; i < dirLength; i++){
dirpath = dirpath + dirs[i] + "/";
fs.mkdir(dirpath, 0777, function(err){
if(err){
//console.log("creat dir fail: "+dirpath);
}
});
}
console.log(" fail: this is Directory");
}else{
console.log("unknow type of file");
}
}
});
}
app.get('/setchmod2dir', function(req, res){
console.log("----------- setchmod2dir -------------------")
console.log(req.query);
var path = rootdir + req.query.path;
var tempfilesNum = req.query.filenum;
var realfilesnum = geFileList(path);
if(tempfilesNum <= realfilesnum){
shellprocess.exec("chmod -R 777 " + path);
console.log("------------------------------------------ "+path);
console.log(realfilesnum);
res.send(200,"chmod");
}
else{
console.log(realfilesnum);
res.send(200,"fail");
}
});
hawtio.use('/resumable.js',function(req,res){
res.setHeader("content-type", "text/javascript");
fs.createReadStream("./app/resumable.js").pipe(res);
});
/*hawtio.use('/style.css',function(req,res){
res.setHeader("content-type", "text/css");
fs.createReadStream("./app/style.css").pipe(res);
});*/
hawtio.use('/connectToOracle',function(req,res){
var rcName = req.query.oracleName;
cancelOracleConectionTask(rcName);
kubectl.rc.get(rcName,function(err, rc){
//console.log(rc);
if(err){
console.log(err);
return
}
if(rc && rc.status.replicas === 1 && rc.metadata.labels.hasOwnProperty("style") && rc.metadata.labels.style === "oracle"){
var selector = rc.spec.selector;
var task = {
taskName: rcName,
taskTime: 0,
taskCrontab: crontab.scheduleJob("*/1 * * * *", function(){ //This will call this function every 2 minutes
//console.log(rcName + "it's been 1 minutes!");
if(task.taskTime === 9){
kubectl.rc.command("label --overwrite rc " + task.taskName + " status=1", function(err, data){
if(err)
console.log(err);
crontab.cancelJob(task.taskCrontab);
cancelOracleConectionTask(task.rcName);
});
}
var selectorPods = [];
kubectl.pod.list(function(err, pods){
if(!err){
pods.items.forEach(function(item){
if(myjs.selectorMatches(selector, item.metadata.labels))
selectorPods.push(item);
});
if(selectorPods.length === 0)
return;
var host = selectorPods[0].status.hostIP
var port = selectorPods[0].spec.containers[0].ports[0].hostPort;
if(host && port){
oracledb.getConnection(
{
user : "system",
password : "oracle",
connectString : host + ":" + port + "/orcl"
},function(err, connection){
if (err) {
console.log("connection failed! message" + err.message);
return;
}
console.log("connect success!");
kubectl.rc.command("label --overwrite rc " + task.taskName + " status=2", function(err, data){
if(err){
console.log(err);
}
console.log("update replicationControllers " + rcName + " success");
if(connection !== null){
connection.close(function(err){
if (err){
console.error(err.message);
}
crontab.cancelJob(task.taskCrontab);
cancelOracleConectionTask(task.rcName);
console.log("connection closed!");
});
}
});
});
}
}
});
task.taskTime++;
})
}
schedule.push(task);
}
res.send(200,"Ok");
res.end();
});
});
hawtio.use('/cancelOracleConection', function(req,res){
var rcName = req.query.oracleName;
cancelOracleConectionTask(rcName);
res.send(200,"Ok");
res.end();
});
hawtio.use('/extractOracleData', function(req,res){
var data = req.query.param;
console.log(data);
});
hawtio.listen(function(server) {
var host = server.address().address;
var port = server.address().port;
console.log("started from gulp file at ", host, ":", port);
});
});
gulp.task('reload', function() {
gulp.src('.')
.pipe(hawtio.reload());
});
gulp.task('build', ['bower', 'path-adjust', 'tsc', 'less', 'template', 'concat', 'clean']);
gulp.task('site', ['clean', 'build'], function() {
gulp.src(['index.html', 'osconsole/config.js.tmpl', 'css/**', 'images/**', 'img/**', 'libs/**', 'dist/**'], {base: '.'}).pipe(gulp.dest('site'));
var dirs = fs.readdirSync('./libs');
dirs.forEach(function(dir) {
var path = './libs/' + dir + "/img";
try {
if (fs.statSync(path).isDirectory()) {
console.log("found image dir: " + path);
var pattern = 'libs/' + dir + "/img/**";
gulp.src([pattern]).pipe(gulp.dest('site/img'));
}
} catch (e) {
// ignore, file does not exist
}
});
});
gulp.task('default', ['connect']);
function cancelOracleConectionTask(taskName){
var taskIndex = -1;
for(var index in schedule){
var connectionTask = schedule[index];
if(connectionTask.hasOwnProperty("taskName") && connectionTask.taskName === taskName){
crontab.cancelJob(connectionTask.taskCrontab);
console.log("Connection Task(taskName: " + taskName + ")" + " Canceled!");
taskIndex = index;
break;
}
}
if(taskIndex !== -1){
schedule.splice(taskIndex,1);
console.log("Remove task(taskName: " + taskName + ") from schedule");
}else{
console.log("There Are No Connection Task(taskName: " + taskName + ")" + " Can be Canceled!");
}
}
function geFileList(path)
{
var filesList = [];
  readFile(path,filesList);
return filesList.length;
}
//遍历读取文件
function readFile(path,filesList)
{
files = fs.readdirSync(path);//需要用到同步读取
files.forEach(walk);
function walk(file)
{
states = fs.statSync(path+'/'+file);  
   if(states.isDirectory())
   {
   readFile(path+'/'+file,filesList);
   }
else{
   //创建一个对象保存信息
    var obj = new Object();
    obj.size = states.size;//文件大小,以字节为单位
    obj.name = file;//文件名
    obj.path = path+'/'+file; //文件绝对路径
    filesList.push(obj);
   }
  }
}