ks3
Version:
本代码库为`金山云存储KS3`服务.主要提供`KS3 nodejs SDK`和`命令行工具`.
546 lines (507 loc) • 12.7 kB
JavaScript
var KS3 = require('../');
var path = require('path');
var async = require('async');
var util = require('../lib/util');
var nconf = require('nconf');
require('colorful').colorful();
var uploadignore = require('./uploadignore');
var xml2json = require("../lib/util").xml2json;
var config = require('../config');
/**
* 配置文件
*/
var configFile = path.join(__dirname, 'developer.json');
nconf.file({
file: configFile
});
/**
* 工具
*/
var check = {
ak: function(akStr) {
if ( !! akStr && akStr.length <= 26) {
return akStr;
} else {
throw new Error(' 输入的AK是非法的')
}
},
sk: function(skStr) {
if ( !! skStr && skStr.length <= 68) {
return skStr;
} else {
throw new Error(' 输入的SK是非法的')
}
},
bucketName: function(bucketName) {
if ( !! bucketName && util.verifyBucket(bucketName)) {
return bucketName;
} else {
throw new Error(' bucket名称不符合规范,https://docs.ksyun.com/documents/2286')
}
},
key: function(keyStr) {
if ( !! keyStr && keyStr.length > 0) {
return keyStr;
} else {
throw new Error(' key不符合规范,https://docs.ksyun.com/documents/2286')
}
},
region: function(region) {
if(region in config.ENDPOINT ) {
return region;
}else {
throw new Error(' region不存在,有效值: BEIJING|HONGKONG|SHANGHAI|GUANGZHOU|RUSSIA|SINGAPORE|JR_BEIJING|JR_SHANGHAI')
}
}
}
var program = require('commander');
var promptly = require('promptly');
program.on('--help', function() {
console.log(' 金山云存储:https://docs.ksyun.com/products/25');
console.log('');
});
/**
* 初始化操作:
*/
program.command('init').description('命令初始化,设置个人信息').option("-a --ak [ak]", "上传文件要存储到的Bucket").option("-s --sk [sk]", "上传文件要存储到的Bucket").option("-b --bucket [bucket]", "上传文件要存储到的Bucket").option("-r --region [region]", "Bucket所在的Region").action(function(options) {
init(options);
});
/**
* 重置操作
*/
program.command('reset').description('重置当前配置').action(function() {
reset();
});
/**
* 上传操作
*/
program.command('upload').description('上传文件或者文件夹').option("-p --path [path]", "选择要上传的文件的地址").option("-b --bucket [bucket]", "上传文件要存储到的Bucket").option("-k --key [key]", "文件(文件夹)存储名称").option("--withsubdir", "是否上传子文件夹").option("-r --region [region]", "目标Bucket所在的Region").action(function(options) {
upload(options);
});
/**
* 下载文件,还不支持下载文件夹
*/
program.command('download').description('下载文件').option("-p --path [path]", "选择下载文件的存放地址").option("-b --bucket [bucket]", "下载文件所在的Bucket").option("-k --key [key]", "下载文件的名称").option("-r --region [region]", "Bucket所在的Region").action(function(options) {
download(options);
});
program.version(KS3.version).usage('<command> [options]').parse(process.argv);
if (!program.args.length) program.help();
/**
* 具体操作
*/
/**
* 存储ak,sk,bucket和region
*/
function init(options) {
var akStr = options.ak || '';
var skStr = options.sk || '';
var bucketStr = options.bucket || '';
var regionStr = options.region || '';
console.log(' 请按照指示完成配置信息:');
console.log(' 关于AK和SK,相关文档请访问:https://docs.ksyun.com/documents/2286');
console.log('');
var stepAK = 'AK(AccessKey)*: ';
var stepSK = 'SK(Access Key Secret)*: ';
var stepBucket = 'Bucket: ';
var stepRegion = 'Region: ';
async.series([function(callback) {
if (!akStr) {
promptly.prompt(stepAK, {
validator: check.ak,
default:
akStr
},
function(err, akStr) {
if (err) {
console.error(err);
return err.retry()
} else {
callback(null, akStr);
}
});
if ( !! nconf.get('AK')) {
try{
process.stdin.emit('data', nconf.get('AK'));
} catch(e){}
}
} else {
callback(null, akStr)
}
},
function(callback) {
if (!skStr) {
promptly.prompt(stepSK, {
validator: check.sk,
default:
skStr
},
function(err, skStr) {
if (err) {
console.error(err);
return err.retry()
} else {
callback(null, skStr);
}
});
if ( !! nconf.get('SK')) {
try{
process.stdin.emit('data', nconf.get('SK'));
} catch (e){}
}
} else {
callback(null, skStr)
}
},
function(callback) {
if (!bucketStr) {
promptly.prompt(stepBucket, {
validator: check.bucketName,
default:
bucketStr
},
function(err, bucketStr) {
if (err) {
console.error(err);
return err.retry()
} else {
callback(null, bucketStr);
}
});
if ( !! nconf.get('BUCKET')) {
try{
process.stdin.emit('data', nconf.get('BUCKET'));
} catch (e){}
}
} else {
callback(null, bucketStr)
}
},
function(callback) {
if (!regionStr) {
promptly.prompt(stepRegion, {
validator: check.region,
default:
regionStr
},
function(err, regionStr) {
if (err) {
console.error(err);
return err.retry()
} else {
callback(null, regionStr);
}
});
if ( !! nconf.get('REGION')) {
try{
process.stdin.emit('data', nconf.get('REGION'));
} catch (e){}
}
} else {
callback(null, regionStr)
}
}], function(err, results) {
if (err) {
console.log(err);
throw err;
} else {
var ak = results[0];
var sk = results[1];
var bucket = results[2];
var region = results[3];
nconf.set('AK', ak);
nconf.set('SK', sk);
if (bucket !== '') {
nconf.set('BUCKET', bucket);
}
if( region !== '') {
nconf.set('REGION',region);
}
nconf.save();
}
})
};
/**
* 重置
*/
function reset() {
promptly.choose(' Do you want to reset the config?(yes or no) ', ['yes', 'no'], function(err, value) {
if (value === 'yes') {
nconf.set('AK', '');
nconf.set('SK', '');
nconf.set('BUCKET', '');
nconf.set('REGION','');
nconf.save();
console.log(' 已经清空配置和上次历史记录');
}
});
}
/**
* 上传
*/
function upload(options) {
var stepPath = ' PATH: ';
var stepBucket = ' Bucket: ';
var stepKey = ' Key: ';
var stepRegion = ' Region: ';
var akStr = nconf.get('AK') || '';
var skStr = nconf.get('SK') || '';
var filePath = options.path || '';
var bucketStr = options.bucket || nconf.get('BUCKET') || '';
var keyStr = options.key || '';
var withsubdir = options.withsubdir ? options.withsubdir: false;
var regionStr = options.region || nconf.get('REGION') || '';
if (akStr === '' || skStr === '') {
console.error(' 还没有进行初始化设置,请先使用命令 `ks3 init` 进行初始化');
process.exit(0);
}
if (!filePath) {
console.log(' 请输入要上传的文件(或文件夹)的地址')
promptly.prompt(stepPath, function(err, filePath) {
if (err) {
console.error(err);
return err.retry()
} else {
nconf.set('PATH', filePath);
nconf.save();
upload({
path: filePath
});
}
});
if ( !! nconf.get('PATH')) {
try{
process.stdin.emit('data', nconf.get('PATH'));
} catch(e){}
}
} else {
async.series([function(callback) {
if (!bucketStr) {
console.log(' 请输入上传文件(文件夹)到指定的Bucket: ')
promptly.prompt(stepBucket, {
validator: check.bucketName
},
function(err, bucket) {
if (err) {
console.error(err);
return err.retry()
} else {
nconf.set('BUCKET', bucket);
nconf.save();
callback(null, bucket);
}
});
if ( !! nconf.get('BUCKET')) {
try{
process.stdin.emit('data', nconf.get('BUCKET'));
} catch(e){}
}
} else {
callback(null, bucketStr);
}
},
function(callback) {
if (!keyStr) {
console.log(' 请输入上传文件(文件夹)的名称: ')
promptly.prompt(stepKey, {
validator: check.key
},
function(err, key) {
if (err) {
console.error(err);
return err.retry()
} else {
nconf.set('KEY', key);
nconf.save();
callback(null, key);
}
});
if ( !! nconf.get('KEY')) {
try{
process.stdin.emit('data', nconf.get('KEY'));
} catch(e){}
}
} else {
callback(null, keyStr);
}
},
function(callback) {
if (!regionStr) {
var region = 'BEIJING';
nconf.set('REGION', region);
nconf.save();
callback(null, region);
} else {
callback(null, regionStr);
}
}], function(err, results) {
if (err) {
console.log(err);
throw err;
} else {
var flag = "----------------------------";
var bucket = results[0];
var key = results[1];
var region = results[2];
nconf.set('BUCKET', bucket);
nconf.set('REGION',region);
nconf.save();
var client = new KS3({
ak: akStr,
sk: skStr,
bucket,
region
});
console.log(' 开始上传');
console.log(flag);
filePath = filePath.replace(/(\\\s)/ig, ' ');
client.upload.start({
Bucket: bucket,
FilePath: filePath,
Key: key,
FileSetting: {
isDeep: withsubdir,
ignore: uploadignore
}
},
function(err, data, res) {
if (err) {
console.log(err);
throw err;
}
console.log(flag + '\n 上传完毕');
}
);
}
})
}
}
/**
* 下载
*/
function download(options) {
var stepPath = ' PATH: ';
var stepBucket = ' Bucket: ';
var stepKey = ' Key: ';
var akStr = nconf.get('AK') || '';
var skStr = nconf.get('SK') || '';
var filePath = options.path || '';
var bucketStr = options.bucket || '';
var keyStr = options.key || '';
var regionStr = options.region || nconf.get('REGION') || '';
if (akStr === '' || skStr === '') {
console.error(' 还没有进行初始化设置,请先使用命令 `ks3 init` 进行初始化');
process.exit(0);
}
if (!filePath) {
console.log(' 请输入下载文件保存的路径(如:/Users/xx/Desktop/tt.jpg)')
promptly.prompt(stepPath, function(err, filePath) {
if (err) {
console.error(err);
return err.retry()
} else {
nconf.set('PATH', filePath);
nconf.save();
download({
path: filePath
});
}
});
if ( !! nconf.get('PATH')) {
process.stdin.emit('data', nconf.get('PATH'));
}
} else {
async.series([function(callback) {
if (!bucketStr) {
console.log(' 请输入要下载文件所在的Bucket: ')
promptly.prompt(stepBucket, {
validator: check.bucketName
},
function(err, bucket) {
if (err) {
console.error(err);
return err.retry()
} else {
nconf.set('BUCKET', bucket);
nconf.save();
callback(null, bucket);
}
});
if ( !! nconf.get('BUCKET')) {
try {
process.stdin.emit('data', nconf.get('BUCKET'));
} catch(e){}
}
} else {
callback(null, bucketStr);
}
},
function(callback) {
if (!keyStr) {
console.log(' 请输入要下载文件的名称: ')
promptly.prompt(stepKey, {
validator: check.key
},
function(err, key) {
if (err) {
console.error(err);
return err.retry()
} else {
nconf.set('KEY', key);
nconf.save();
callback(null, key);
}
});
if ( !! nconf.get('KEY')) {
try {
process.stdin.emit('data', nconf.get('KEY'));
} catch(e){}
}
} else {
callback(null, keyStr);
}
},
function(callback) {
if (!regionStr) {
//console.log(' 请输入Bucket所在位置(BEIJING|HONGKONG|AMERICA|SHANGHAI): ');
var region = 'BEIJING';
nconf.set('REGION', region);
nconf.save();
callback(null, region);
} else {
callback(null, regionStr);
}
}], function(err, results) {
if (err) {
throw err;
} else {
var flag = "----------------------------";
var bucket = results[0];
var key = results[1];
var region = results[2];
nconf.set('BUCKET', bucket);
nconf.set('REGION',region);
nconf.save();
console.log(' 开始下载');
console.log(flag);
var client = new KS3({
ak: akStr,
sk: skStr, bucket, region
});
filePath = filePath.replace(/(\\\s)/ig, ' ');
client.download.start({
Bucket: bucket,
FilePath: filePath,
Key: key
},
function(err, data, res) {
if (err){
console.log(err)
throw err;
}
console.log(flag + '\n 下载完毕');
});
}
})
}
}