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: '/// ' })) .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);    }   } }