Skip to content

Instantly share code, notes, and snippets.

@andreareginato
Created October 6, 2017 15:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save andreareginato/d0b449f7fbba6e4cd24676d60ce69914 to your computer and use it in GitHub Desktop.
Save andreareginato/d0b449f7fbba6e4cd24676d60ce69914 to your computer and use it in GitHub Desktop.
sftp node server
"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