Created
October 6, 2017 15:48
-
-
Save andreareginato/d0b449f7fbba6e4cd24676d60ce69914 to your computer and use it in GitHub Desktop.
sftp node server
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
var fs = require('fs'); | |
var SFTPServer = require("node-sftp-server"); | |
var ReadableStreamClone = require("readable-stream-clone"); | |
// create the server | |
var srv = new SFTPServer({ | |
privateKeyFile: "./id_rsa", | |
temporaryFileDirectory: "./tmp" | |
}); | |
srv.listen(8022); | |
srv.on("connect", function(auth, info) { | |
console.warn("[::][SERVER] Client connected to the SFTP server"); | |
return auth.accept(function(session) { | |
console.warn("[::][SESSION] Authenticated"); | |
// the client is attempting to read a file from the server | |
// place or pipe the contents of the file into the writable_stream | |
session.on("readfile", function(path, writestream) { | |
console.log("[::][READ] Reading the server file " + path) | |
console.log("[::][READ] Sending content to client through writestream"); | |
return fs.createReadStream("tmp" + path).pipe(writestream); | |
}); | |
session.on("realpath",function (path,callback) { | |
callback("/tmp/"); | |
console.log("REALPATH:::|:::REALPATH", path); | |
}); | |
session.on("writefile", function(path, readstream, ex) { | |
/* | |
* SPOOL/IN | |
*/ | |
// clone read stream for spool in | |
var readstreamIn = new ReadableStreamClone(readstream); | |
readstreamIn.on("end", function() { console.warn("[::][WRITE SPOOL/OUT] File has been written") }); | |
// set spool in file path | |
var inFile = path; | |
// create empty file | |
fs.closeSync(fs.openSync(inFile, "w")); | |
// write stream content in inFile | |
var writestreamIn = fs.createWriteStream(inFile); | |
readstreamIn.pipe(writestreamIn); | |
/* | |
* SPOOL/OUT | |
*/ | |
// // clone read stream for spool out | |
// var readstreamOut = new ReadableStreamClone(readstream); | |
// readstreamOut.on("end", function() { console.warn("[::][WRITE SPOOL/OUT] File has been written") }); | |
// // set spool out file path | |
// var merchant, method, timestamp; | |
// [ merchant, method, timestamp ] = path.split('_'); | |
// var outFile = "./tmp/spool/out" + merchant.replace('.','') + '_RES_' + Date.now() + '.TXT'; | |
// // create empty file | |
// fs.closeSync(fs.openSync(outFile, "w")); | |
// // add csv information to write stram | |
// readstreamOut.on("end", function() { writestreamOut.write('calm,honesty,truth,love\n') }); | |
// // write stream content in outFile | |
// var writestreamOut = fs.createWriteStream(outFile, { flags:'a' }); | |
// return readstreamOut.pipe(writestreamOut); | |
}); | |
// return session.on ... | |
session.on("readdir",function (path, responder) { | |
console.warn("[::][READ DIR] Request for path ./tmp/spool/out"); | |
var files, i, j, results; | |
// collect the files placed in the out directory | |
// it applies an async flow not clear to me | |
files = (function() { | |
results = []; | |
fs.readdir('./tmp/spool/out', (err, files) => { | |
files.forEach(file => { | |
results.push(file); | |
}); | |
}) | |
return results; | |
}).apply(this); | |
i = 0; | |
responder.on("dir", function() { | |
if (files[i]) { | |
console.warn("Returning " + files[i]); | |
responder.file(files[i]); | |
return i++; | |
} else { | |
return responder.end(); | |
} | |
}); | |
return responder.on("end", function() { | |
return console.warn("[::][READ DIR] Directory has been read"); | |
}); | |
}); | |
session.on('stat', function(path, statkind, statresponder) { | |
// avoid warning | |
}); | |
}); | |
}); | |
srv.on("error", function() { | |
return console.warn("[::][SERVER] Example server encountered an error"); | |
}); | |
srv.on("end", function() { | |
return console.warn("[::][SERVER] Command completed"); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment