Skip to content

Commit

Permalink
Merge pull request #7 from justmywyw/master
Browse files Browse the repository at this point in the history
1.registry with nexus;2.token;3.file view
  • Loading branch information
Robinlim committed Sep 14, 2016
2 parents ba22184 + 9092b05 commit bbab6b3
Show file tree
Hide file tree
Showing 12 changed files with 453 additions and 109 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
"nomnom": "^1.8.1",
"request": "^2.74.0",
"serve-favicon": "~2.3.0",
"serve-index": "^1.8.0",
"shelljs": "^0.7.3",
"tar": "^2.2.1"
}
Expand Down
4 changes: 0 additions & 4 deletions src/js/annotation/Flow/Flow.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,6 @@ var Flow = module.exports = require('node-annotation').Annotation.extend({
//添加启动方法
instance.start = function(){
async.auto(steps, function(err, results){
if(err){
console.error(err);
return;
}
_.each(done, function(cb){
cb.call(instance, err, results);
});
Expand Down
5 changes: 4 additions & 1 deletion src/js/app/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,12 @@ var favicon = require('serve-favicon');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var compression = require('compression');

var serveIndex = require('serve-index');
var utils = require('../common/utils');
// 初始化express
var app = express();


// 如果存在版本文件,则初始化版本号,ref/ver为版本号存放目录,版本文件形式与fekit保持一致
var versionPath = path.join(__dirname, 'ref/ver/versions.mapping'),
versions = [];
Expand Down Expand Up @@ -57,4 +59,5 @@ app.get('/healthcheck.html', function(req, res) {
res.end(cont);
});

app.use('/view', serveIndex(utils.getServerCachePath(), {'icons': true}))
module.exports = app;
19 changes: 18 additions & 1 deletion src/js/app/controller/index.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
'use strict'
var path = require('path'),
fsExtra = require('fs-extra'),
utils = require('../../common/utils');

require('shelljs/global');

var modulesCachePath = utils.getServerCachePath(),
fileExt = utils.getFileExt(),
UPLOADDIR = 'upload_dir';
UPLOADDIR = 'upload_dir',
TOKENPATH = utils.getTokenPath();
/*@Controller*/
module.exports = {
/*@RequestMapping("/fetch/{moduleName}/{moduleNameForPlatform}")*/
Expand All @@ -28,6 +30,16 @@ module.exports = {
/*@RequestMapping("/upload")*/
/*@ResponseBody*/
upload: function(req, res) {
var token = fsExtra.readJsonSync(TOKENPATH).token;
console.log(token, req.headers.token)
// check token for permission
if(token !== req.headers.token){
res.status(404).end({
message: 'Token missing or wrong! Forbid uploading without token.'
});
return;
}

var multiparty = require('multiparty');
// parse a file upload
var form = new multiparty.Form({
Expand Down Expand Up @@ -76,5 +88,10 @@ module.exports = {
message: 'success'
});
});
},
/*@ExceptionHandler*/
/*@ResponseBody*/
error: function(err, req, res){
res.status(500).end(err.message || err);
}
}
17 changes: 17 additions & 0 deletions src/js/app/controller/manage.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
'use strict'
var path = require('path'),
fsExtra = require('fs-extra'),
utils = require('../../common/utils');

require('shelljs/global');

var modulesCachePath = utils.getServerCachePath(),
fileExt = utils.getFileExt();

/*@Controller*/
module.exports = {
/*@RequestMapping(["/"])*/
view: function(req, res){
res.redirect('/view');
}
}
8 changes: 4 additions & 4 deletions src/js/command/install.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,17 +70,17 @@ module.exports = {
done: function(err, results){
if(err){
console.error(err);
this.exit();
this.exit(1);
return;
}
this.exit();
this.exit(0);
},
/**
* 退出
* @return {[type]} [description]
*/
exit: function(){
exit: function(code){
console.info('******************安装结束******************');
process.exit();
process.exit(code);
}
}
15 changes: 14 additions & 1 deletion src/js/command/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,28 @@
var _ = require('lodash'),
path = require('path'),
utils = require('../common/utils'),
fsExtra = require('fs-extra'),
childProcess = require('child_process');

require('shelljs/global');

var app = path.join(__dirname, '../app');
var app = path.join(__dirname, '../app'),
tokenPath = utils.getTokenPath();

/*@Command("server")*/
module.exports = {
run: function(opts) {
// 设置上传token
var token = 'npm_cache_share'; // default token
if(opts.token){
token = opts.token;
delete opts.token;
}
fsExtra.writeJsonSync(tokenPath, {
token: token
});
console.log(tokenPath, token)

var pm2 = which('pm2');
var env = _.extend({
port: opts.port || '8888'
Expand Down
118 changes: 21 additions & 97 deletions src/js/common/installUtils.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ var path = require('path'),

require('shelljs/global');

var utils = require('./utils');
var utils = require('./utils'),
registryAdapter = require('./registryAdapter');

var LIBNAME = 'node_modules',
UPLOADDIR = 'upload_dir',
Expand Down Expand Up @@ -44,8 +45,7 @@ module.exports = {
delete opts.noOptional;
opts["no-optional"] = true;
}
this.server = opts.service;
delete opts.service;
this.registry = registryAdapter(opts);
//构建安装参数
this.opts = utils.toString(opts);
//确保文件夹存在并可写入
Expand All @@ -54,9 +54,20 @@ module.exports = {

console.info('开始解析');
//判断公共缓存是否存在
this.checkServer(_.bind(function() {
if(this.registry && this.registry.check){
this.registry.check(_.bind(function(avaliable) {
// 公共缓存是否可用
if(avaliable){
this.parseModule(dependencies, callback);
} else {
delete this.registry;
this.parseModule(dependencies, callback);
}
}, this));
} else {
delete this.registry;
this.parseModule(dependencies, callback);
}, this));
}
},
/**
* 解析模块
Expand All @@ -76,11 +87,11 @@ module.exports = {
}, this));

//需要将新的模块同步到远程服务
this.syncRemote(path.resolve(__cache, UPLOADDIR), function() {
this.syncRemote(path.resolve(__cache, UPLOADDIR), function(err) {
//删除缓存的node_modules目录
console.info('删除临时目录');
rm('-rf', path.resolve(__cache, LIBNAME));
callback();
callback(err);
});
},
/**
Expand All @@ -100,7 +111,7 @@ module.exports = {
cacheModulePath = this.fromCache(this.getModuleNameForPlatform(name, version));
}
//如果本地不存在,尝试从公共服务缓存中获取
if (!cacheModulePath && this.serverReady()) {
if (!cacheModulePath && this.registry) {
cacheModulePath = this.fromRemoteToCache(npmModule, this.getModuleNameForPlatform(name, version)).await();
}
//本地和服务端都不存在,则安装该模块
Expand Down Expand Up @@ -166,35 +177,7 @@ module.exports = {
*/
/*@AsyncWrap*/
fromRemoteToCache: function(moduleName, moduleNameForPlatform, cb) {
request
.get(['http:/', this.server, 'fetch', moduleName, moduleNameForPlatform].join('/'))
.on('response', function(response) {
if (response.statusCode == 200) {
// 获取文件名称
var target = path.resolve(__cache, response.headers.modulename + fileExt);
// 解压文件操作
var extractor = tar.Extract({
path: __cache
})
.on('error', function(err){
console.error(target + ' extract is wrong ', err.stack);
cb(null, false);
})
.on('end', function(){
console.info(target + ' extract done!');
target = path.resolve(__cache, response.headers.modulename);
cb(null, fs.existsSync(target) && target);
});
// 请求返回流通过管道流入解压流
response.pipe(extractor);
return;
}
cb(null, false);
})
.on('error', function(err) {
cb(null, false);
console.error(err);
});
this.registry.get(moduleName, moduleNameForPlatform, __cache, cb);
},
/**
* 本地安装模块,依赖扁平化
Expand Down Expand Up @@ -243,37 +226,7 @@ module.exports = {
* @return {void}
*/
syncRemote: function(modulePath, callback) {
if (!this.serverReady() || !fs.existsSync(modulePath)) {
callback();
return;
}
var target = path.resolve(__cache, Date.now() + fileExt),
server = this.server;
console.info('开始压缩需要上传模块');
// compress
utils.compress(modulePath, target, function(err) {
if (err) {
console.error('compress wrong ', err.stack);
callback();
return;
}
console.info('同步模块至服务http://' + server);
request.post({
url: 'http://' + server + '/upload',
formData: {
modules: fs.createReadStream(target)
}
}, function(err) {
rm('-f', target);
if (err) {
console.error('上传失败:', err);
callback();
return;
}
console.info('上传成功');
callback();
});
});
this.registry.put(modulePath, callback);
},
/**
* 深度遍历模块依赖
Expand Down Expand Up @@ -322,35 +275,6 @@ module.exports = {
}
return [name, version].join('@').replace(RegExp('/', 'g'), SPLIT);
},
/**
* 判断服务是否正常
* @return {[type]} [description]
*/
checkServer: function(cb) {
if (!this.server) {
cb();
return;
}
request
.get('http://' + this.server + '/healthcheck.html')
.on('response', _.bind(function() {
cb(this.serverHealth = true);
}, this))
.on('error', _.bind(function(err) {
console.error(this.server + '该服务不可正常访问,请检查服务!');
cb(this.serverHealth = false);
}, this));
},
/**
* 判断服务是否正常
* @return {[type]} [description]
*/
serverReady: function() {
if (!this.server) return false;
if (this.serverHealth) return true;
if (this.serverHealth === false) return false;
return false;
},
/**
* 获得缓存路径
* @return {[type]} [description]
Expand Down
35 changes: 35 additions & 0 deletions src/js/common/registryAdapter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
var nexusRegistry = require('../registry/nexus'),
nodeRegistry = require('../registry/node');

module.exports = function(opts){
var type = opts.type;
delete opts.type;
switch (type) {
case 'nexus':
var repository = opts.registry,
authArr = opts.auth.split(':'),
auth = {
user: authArr[0],
password: authArr[1]
};
delete opts.registry;
delete opts.auth;
return new nexusRegistry({
repository: repository,
auth: auth
});
break;
case 'node':
var server = opts.registry,
token = opts.token;
delete opts.registry;
delete opts.token;
return new nodeRegistry({
server: server,
token: token
});
break;
default:
return null;
}
}
11 changes: 10 additions & 1 deletion src/js/common/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,16 @@ module.exports = {
* @return {[type]} [description]
*/
getFileExt: function() {
return '.tar.gz';
return '.tar';
},
/**
* 获取存储token的文件路径
* @return {path} [description]
*/
getTokenPath: function() {
var file = path.resolve(process.cwd(), 'token.json');
fsExtra.ensureFileSync(file);
return file;
},
/**
* 获取服务器端缓存cache的目录
Expand Down
Loading

0 comments on commit bbab6b3

Please sign in to comment.