From 6ce0fdc4abb74d93763c96de6b21880f929e93cd Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti Date: Mon, 2 Feb 2015 12:25:22 -0400 Subject: [PATCH] Make use of diskio --- lib/actions/device.coffee | 26 +++++++++++++----- lib/drive/agnostic.coffee | 29 -------------------- lib/drive/drive.coffee | 57 --------------------------------------- lib/drive/win32.coffee | 33 ----------------------- man/resin-completion.1 | 2 +- man/resin-plugins.1 | 2 +- man/resin.1 | 2 +- package.json | 3 ++- 8 files changed, 25 insertions(+), 129 deletions(-) delete mode 100644 lib/drive/agnostic.coffee delete mode 100644 lib/drive/drive.coffee delete mode 100644 lib/drive/win32.coffee diff --git a/lib/actions/device.coffee b/lib/actions/device.coffee index 97542a1f..c516bb06 100644 --- a/lib/actions/device.coffee +++ b/lib/actions/device.coffee @@ -4,9 +4,11 @@ async = require('async') resin = require('resin-sdk') os = require('os') visuals = require('resin-cli-visuals') +fs = require('fs') +progressStream = require('progress-stream') drivelist = require('drivelist') +diskio = require('diskio') commandOptions = require('./command-options') -drive = require('../drive/drive') exports.list = signature: 'devices' @@ -199,13 +201,25 @@ exports.init = (confirmed, callback) -> return done() if not confirmed - bar = new visuals.widgets.Progress('Writing Device OS') + imageFileSize = fs.statSync(params.image).size - drive.writeImage params.device, params.image, - progress: not options.quiet - onProgress: (status) -> + if imageFileSize is 0 + error = new Error("Invalid OS image: #{params.image}. The image is 0 bytes.") + return callback(error) + + progress = progressStream + length: imageFileSize + time: 500 + + if not options.quiet + bar = new visuals.widgets.Progress('Writing Device OS') + + progress.on 'progress', (status) -> console.log(bar.tick(status.percentage, status.eta)) - , callback + + imageFileStream = fs.createReadStream(params.image).pipe(progress) + + diskio.writeStream(params.device, imageFileStream, callback) ], (error) -> if os.platform() is 'win32' and error? and (error.code is 'EPERM' or error.code is 'EACCES') diff --git a/lib/drive/agnostic.coffee b/lib/drive/agnostic.coffee deleted file mode 100644 index 36823818..00000000 --- a/lib/drive/agnostic.coffee +++ /dev/null @@ -1,29 +0,0 @@ -progressStream = require('progress-stream') -fs = require('fs') -_ = require('lodash-contrib') - -exports.writeImage = (imagePath, devicePath, onProgress, callback) -> - - imageFileSize = fs.statSync(imagePath).size - - if imageFileSize is 0 - error = new Error("Invalid OS image: #{imagePath}. The image is 0 bytes.") - return callback(error) - - progress = progressStream - length: imageFileSize - time: 500 - - progress.on('progress', onProgress or _.noop) - - deviceFileStream = fs.createWriteStream devicePath, - flags: 'rs+' - - deviceFileStream.on('error', callback) - - imageFileStream = fs.createReadStream(imagePath) - imageFileStream - .pipe(progress) - .pipe(deviceFileStream) - .on('error', _.unary(callback)) - .on('close', _.unary(callback)) diff --git a/lib/drive/drive.coffee b/lib/drive/drive.coffee deleted file mode 100644 index 392731f6..00000000 --- a/lib/drive/drive.coffee +++ /dev/null @@ -1,57 +0,0 @@ -os = require('os') -fs = require('fs') -_ = require('lodash-contrib') -async = require('async') - -IS_WINDOWS = os.platform() is 'win32' - -win32 = require('./win32') -agnostic = require('./agnostic') - -exports.writeImage = (devicePath, imagePath, options = {}, callback = _.noop) -> - - async.waterfall [ - - (callback) -> - fs.exists imagePath, (exists) -> - return callback() if exists - return callback(new Error("Invalid OS image: #{imagePath}")) - - (callback) -> - return callback() if IS_WINDOWS - fs.exists devicePath, (exists) -> - return callback() if exists - return callback(new Error("Invalid device: #{devicePath}")) - - (callback) -> - return callback() if not IS_WINDOWS - win32.eraseMBR(devicePath, callback) - - (callback) -> - return callback() if not IS_WINDOWS - win32.rescanDrives(_.unary(callback)) - - (callback) -> - if not options.progress - options.onProgress = _.noop - - agnostic.writeImage(imagePath, devicePath, options.onProgress, callback) - - (callback) -> - return callback() if not IS_WINDOWS - win32.rescanDrives(_.unary(callback)) - - ], (error) -> - return callback() if not error? - - if error.code is 'EBUSY' - error.message = "Try umounting #{error.path} first." - - if error.code is 'ENOENT' - error.message = "Invalid device #{error.path}" - - # Prevents outer handler to take - # it as an usual ENOENT error - delete error.code - - return callback(error) diff --git a/lib/drive/win32.coffee b/lib/drive/win32.coffee deleted file mode 100644 index e27437d0..00000000 --- a/lib/drive/win32.coffee +++ /dev/null @@ -1,33 +0,0 @@ -childProcess = require('child_process') -path = require('path') -_ = require('lodash-contrib') -async = require('async') -fs = require('fs') -diskpart = require('diskpart') - -exports.rescanDrives = (callback) -> - diskpart.evaluate([ 'rescan' ], callback) - -exports.eraseMBR = (devicePath, callback) -> - bufferSize = 512 - - async.waterfall([ - - (callback) -> - fs.open(devicePath, 'rs+', null, callback) - - (fd, callback) -> - buffer = new Buffer(bufferSize) - buffer.fill(0) - fs.write fd, buffer, 0, bufferSize, 0, (error, bytesWritten) -> - return callback(error) if error? - return callback(null, bytesWritten, fd) - - (bytesWritten, fd, callback) -> - if bytesWritten isnt bufferSize - error = "Bytes written: #{bytesWritten}, expected #{bufferSize}" - return callback(error) - - fs.close(fd, callback) - - ], callback) diff --git a/man/resin-completion.1 b/man/resin-completion.1 index 719d91a5..b511c43e 100644 --- a/man/resin-completion.1 +++ b/man/resin-completion.1 @@ -1,4 +1,4 @@ -.TH "RESIN" "1" "January 2015" "" "" +.TH "RESIN" "1" "February 2015" "" "" .SH "NAME" \fBresin\fR \- tab completion for resin .SH DESCRIPTION diff --git a/man/resin-plugins.1 b/man/resin-plugins.1 index ae1fd917..0fca8019 100644 --- a/man/resin-plugins.1 +++ b/man/resin-plugins.1 @@ -1,4 +1,4 @@ -.TH "RESIN\-PLUGINS" "1" "January 2015" "" "" +.TH "RESIN\-PLUGINS" "1" "February 2015" "" "" .SH "NAME" \fBresin-plugins\fR \- Creating Resin CLI plugins .SH DESCRIPTION diff --git a/man/resin.1 b/man/resin.1 index e5eafb23..e62cfa9c 100644 --- a/man/resin.1 +++ b/man/resin.1 @@ -1,4 +1,4 @@ -.TH "RESIN" "1" "January 2015" "" "" +.TH "RESIN" "1" "February 2015" "" "" .SH "NAME" \fBresin\fR \- command line tool to interact with resin\.io .SH SYNOPSIS diff --git a/package.json b/package.json index b421aec2..c8bc2aa3 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "license": "MIT", "optionalDependencies": { "windosu": "^0.1.3", - "diskpart": "^1.0.0" + "diskpart": "^1.0.0" }, "devDependencies": { "chai": "~1.9.2", @@ -50,6 +50,7 @@ "capitano": "~1.3.0", "coffee-script": "~1.8.0", "conf.js": "^0.1.1", + "diskio": "git+https://git@github.com/resin-io/diskio.git", "drivelist": "^1.1.0", "git-cli": "~0.8.2", "lodash": "~2.4.1",