Use diskpart to rescan the drives

This commit is contained in:
Juan Cruz Viotti 2015-01-28 14:41:53 -04:00
parent dcebbc0044
commit 8b0ce36955
2 changed files with 36 additions and 22 deletions

View File

@ -1,31 +1,32 @@
os = require('os')
fs = require('fs') fs = require('fs')
childProcess = require('child_process')
eventStream = require('event-stream') eventStream = require('event-stream')
progressStream = require('progress-stream') progressStream = require('progress-stream')
blockAligner = (blockSize) -> IS_WINDOWS = os.platform() is 'win32'
return eventStream.through (chunk) ->
size = chunk.length % blockSize
if size isnt 0 exports.rescanDrives = (callback) ->
newChunk = new Buffer(chunk.length + (blockSize - size)) return callback() if not IS_WINDOWS
chunk.copy(newChunk) diskpartRescanScriptPath = path.join(__dirname, 'scripts', 'diskpart_rescan')
chunk = newChunk childProcess.exec "diskpart /s #{diskpartRescanScriptPath}", {}, (error) ->
console.log("DISKPART RESULT: #{arguments}")
@emit('data', chunk) return callback(error)
exports.writeImage = (devicePath, imagePath, options = {}, callback = _.noop) -> exports.writeImage = (devicePath, imagePath, options = {}, callback = _.noop) ->
if not fs.existsSync(imagePath) if not fs.existsSync(imagePath)
return callback(new Error("Invalid OS image: #{imagePath}")) return callback(new Error("Invalid OS image: #{imagePath}"))
if not fs.existsSync(devicePath) if not IS_WINDOWS and not fs.existsSync(devicePath)
return callback(new Error("Invalid device: #{devicePath}")) return callback(new Error("Invalid device: #{devicePath}"))
imageFile = fs.createReadStream(imagePath) imageFile = fs.createReadStream(imagePath)
deviceFile = fs.createWriteStream devicePath, deviceFile = fs.createWriteStream devicePath,
# Required by Windows to work correctly # Required by Windows to work correctly
flags: 'r+' flags: 'rs+'
imageFileSize = fs.statSync(imagePath).size imageFileSize = fs.statSync(imagePath).size
@ -36,16 +37,28 @@ exports.writeImage = (devicePath, imagePath, options = {}, callback = _.noop) ->
if options.progress if options.progress
progress.on('progress', options.onProgress) progress.on('progress', options.onProgress)
imageFile async.waterfall([
.pipe(blockAligner(512))
.pipe(progress) (callback) ->
.pipe(deviceFile) exports.rescanDrives(callback)
(callback) ->
imageFile
.pipe(progress)
.pipe(deviceFile)
# TODO: We should make use of nodewindows.elevate()
# if we get an EPERM error.
.on 'error', (error) ->
if error.code is 'EBUSY'
error.message = "Try umounting #{error.path} first."
return callback(error)
.on('close', callback)
(callback) ->
exports.rescanDrives(callback)
], callback)
# TODO: We should make use of nodewindows.elevate()
# if we get an EPERM error.
.on 'error', (error) ->
if error.code is 'EBUSY'
error.message = "Try umounting #{error.path} first."
return callback(error)
.on('close', callback)

View File

@ -0,0 +1 @@
rescan