filestash/server/model/backend/sftp.js

89 lines
2.8 KiB
JavaScript

var Client = require('ssh2-sftp-client');
const connections = {};
setInterval(() => {
for(let key in connections){
if(connections[key].date + (1000*120) < new Date().getTime()){
connections[key].conn.end();
delete connections[key];
}
}
}, 5000);
function connect(params){
if(connections[JSON.stringify(params)]){
connections[JSON.stringify(params)].date = new Date().getTime();
return Promise.resolve(connections[JSON.stringify(params)].conn);
}else{
let sftp = new Client();
let opts = {host: params.host, port: params.port || 22, username: params.username};
if(params.hasOwnProperty('private_key') && params['private_key']){
opts.privateKey = params['private_key']
}else{
opts.password = params['password'];
}
return sftp.connect(opts).then((res) => {
connections[JSON.stringify(params)] = {
date: new Date().getTime(),
conn: sftp
}
return Promise.resolve(sftp)
});
}
}
module.exports = {
test: function(params){
return connect(params)
.then(() => Promise.resolve(params))
},
cat: function(path, params){
return connect(params)
.then((sftp) => sftp.get(path, false, null));
},
ls: function(path, params){
return connect(params)
.then((sftp) => sftp.list(path))
.then((res) => Promise.resolve(res.map((file) => {
return {
type: function(type){
if(type === 'd'){
return 'directory'
}else if(type === 'l'){
return 'link';
}else if(type === '-'){
return 'file';
}else{
return 'unknown';
}
}(file.type),
name: file.name,
size: file.size,
time: file.modifyTime
};
})));
},
write: function(path, content, params){
return connect(params)
.then((sftp) => sftp.put(content, path))
},
rm: function(path, params){
return connect(params)
.then((sftp) => {
return sftp.delete(path)
.catch((err) => sftp.rmdir(path, true))
});
},
mv: function(from, to, params){
return connect(params)
.then((sftp) => sftp.rename(from, to));
},
mkdir: function(path, params){
return connect(params)
.then((sftp) => sftp.mkdir(path, false))
},
touch: function(path, params){
return connect(params)
.then((sftp) => sftp.put(Buffer.from(''), path))
}
}