diff --git a/lib/cli.js b/lib/cli.js index 5793fbfd..6206a73d 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -764,19 +764,24 @@ program , String) .option('--profile ' , 'your aws credentials profile name' - , String - , 'stf-storage') + , String) .option('--endpoint ' , 'your buckets endpoint' - , String - , 's3-ap-northeast-1.amazonaws.com') + , String) .action(function(options) { - require('./units/storage/amazons3')({ + if (!options.profile) { + this.missingArgument('--profile') + } + + if (!options.endpoint) { + this.missingArgument('--endpoint') + } + + require('./units/storage/s3')({ port: options.port , profile: options.profile , bucket: options.bucket , endpoint: options.endpoint - , expires: options.expires }) }) diff --git a/lib/units/storage/amazons3.js b/lib/units/storage/s3.js similarity index 68% rename from lib/units/storage/amazons3.js rename to lib/units/storage/s3.js index 1bdae6da..7581bee5 100644 --- a/lib/units/storage/amazons3.js +++ b/lib/units/storage/s3.js @@ -11,21 +11,19 @@ var Promise = require('bluebird') var uuid = require('node-uuid') var AWS = require('aws-sdk') -var lifecycle = require('../../util/lifecycle') var logger = require('../../util/logger') -var requtil = require('../../util/requtil') - module.exports = function(options) { var log = logger.createLogger('storage:s3') - , app = express() - , server = http.createServer(app) - , credentials = new AWS.SharedIniFileCredentials({ + , app = express() + , server = http.createServer(app) + + var s3 = new AWS.S3({ + credentials: new AWS.SharedIniFileCredentials({ profile: options.profile }) - - AWS.config.credentials = credentials; - var s3 = new AWS.S3(options) + , endpoint: options.endpoint + }) app.set('strict routing', true) app.set('case sensitive routing', true) @@ -37,23 +35,27 @@ module.exports = function(options) { function putObject(plugin, file) { return new Promise(function(resolve, reject) { var id = uuid.v4() - var rs = fs.createReadStream(file.path) - s3.putObject({ Key: id - , Body: rs + , Body: fs.createReadStream(file.path) , Bucket: options.bucket , Metadata: { plugin: plugin , name: file.name } - }, function(err, data) { + }, function(err) { if (err) { - log.error('failed to store "%s" bucket:"%s"', id, options.bucket) - log.error(err); - reject(err); - } else { - log.info('Stored "%s" to %s/%s', file.name, options.bucket, id) + log.error( + 'Unable to store "%s" as "%s/%s"' + , file.temppath + , options.bucket + , id + , err.stack + ) + reject(err) + } + else { + log.info('Stored "%s" as "%s/%s"', file.name, options.bucket, id) resolve(id) } }) @@ -69,7 +71,7 @@ module.exports = function(options) { ) } - app.post('/s/upload/:plugin', function(req, res, next) { + app.post('/s/upload/:plugin', function(req, res) { var form = new formidable.IncomingForm() var plugin = req.params.plugin Promise.promisify(form.parse, form)(req) @@ -91,11 +93,10 @@ module.exports = function(options) { }) .then(function(storedFiles) { res.status(201).json({ - success: true, - resources: (function() { + success: true + , resources: (function() { var mapped = Object.create(null) storedFiles.forEach(function(file) { - var plugin = req.params.plugin mapped[file.field] = { date: new Date() , plugin: plugin @@ -109,41 +110,46 @@ module.exports = function(options) { }) return storedFiles }) - .then(function (storedFiles){ - storedFiles.forEach(function (file){ - fs.unlink(file.temppath) - }) + .then(function(storedFiles) { + return Promise.all(storedFiles.map(function(file) { + return Promise.promisify(fs.unlink, fs)(file.temppath) + .catch(function(err) { + log.warn('Unable to clean up "%s"', file.temppath, err.stack) + return true + }) + })) }) .catch(function(err) { log.error('Error storing resource', err.stack) res.status(500) .json({ - success: false, - error: 'ServerError' + success: false + , error: 'ServerError' }) }) }) app.get('/s/blob/:id/:name', function(req, res) { var params = { - Key: req.params.id, - Bucket: options.bucket + Key: req.params.id + , Bucket: options.bucket } + s3.getObject(params, function(err, data) { if (err) { - log.error('failed to retreive[' + path + ']') - log.error(err, err.stack); + log.error('Unable to retrieve "%s"', path, err.stack) res.sendStatus(404) - } else { - res.set({ - 'Content-type': data.ContentType - }) - res.send(data.Body) + return } + + res.set({ + 'Content-Type': data.ContentType + }) + + res.send(data.Body) }) }) - // initialize server.listen(options.port) console.log('Listening on port %d', options.port) }