#!/usr/bin/env node
var fs = require('fs');
var path = require('path');
var client = require('../');
main(process.argv.slice());
function main(argv) {
var identify, src, dest;
var quiet = false;
var port = 22;
var defaults = {};
var getArg = function() {
var args = argv.shift();
args = args.split('=');
if (args.length > 1) {
argv.unshit(args.slice(1).join('='));
}
return args[0];
};
var arg, remains = [];
while (argv.length) {
arg = getArg();
switch(arg) {
case '-p':
case '--port':
port = argv.shift();
break;
case '-q':
case '--quiet':
quiet = true;
break;
case '-i':
case '--identify':
identify = argv.shift();
break;
case '-v':
case '--version':
versionMessage();
break;
case '-h':
case '--help':
helpMessage();
break;
default:
remains.push(arg);
break;
}
}
if (remains.length !== 4) {
helpMessage();
}
printLog(quiet);
src = remains[2];
dest = remains[3];
defaults = {
port: parseInt(port, 10)
};
var password;
var parsed = client.parse(src);
if (parsed.username && parsed.host && parsed.path) {
password = parsed.password;
} else {
password = client.parse(dest).password;
}
client.on('error', function(err) {
if (err.code === 'ECONNREFUSED') {
prompt(' password: ', function(val) {
client.close();
delete client.__ssh;
defaults.password = val;
scp(src, dest, defaults);
});
} else {
console.error(err);
process.exit(1);
}
});
if (!password && identify && fs.existsSync(identify)) {
defaults.privateKey = fs.readFileSync(identify);
scp(src, dest, defaults);
} else if (!password) {
prompt(' password: ', function(val) {
defaults.password = val;
scp(src, dest, defaults);
});
} else {
defaults.password = password;
scp(src, dest, defaults);
}
}
function helpMessage() {
console.log();
var lines = [
' Usage:',
' scp2 [-p 22] localfile server',
'',
' Options:',
' -p, --port [port] ssh port, default: 22',
' -i, --identify [file] identify file',
' -q, --quiet do not show log',
' -v, --version display the version',
' -h, --help display this message',
'',
' Examples:',
' $ scp2 data.txt admin:password@example.com:/home/admin/',
' $ scp2 data.txt admin@example.com:/home/admin/rename.txt',
'',
];
console.log(lines.join('\n'));
process.exit();
}
function versionMessage() {
var pkg = require('../package.json');
var format = require('util').format;
console.log()
console.log(format(' %s %s (%s)', pkg.name, pkg.version, process.platform));
console.log()
process.exit();
}
function printLog(quiet) {
if (!quiet) {
client.on('connect', function() {
log('connected');
});
client.on('ready', function() {
log('ready');
});
client.on('mkdir', function(p) {
log('mkdir ' + p);
});
client.on('write', function(o) {
log('write ' + o.destination);
});
client.on('transfer', function(buf, up, total) {
up = up + 1;
log('transfer ' + up + '/' + total + ' data', up < total);
});
client.on('read', function(p) {
log('read ' + p);
});
client.on('close', function() {
log('close');
});
client.on('end', function() {
log('end');
});
}
}
function prompt(str, fn) {
process.stdout.write(str);
process.stdin.setEncoding('utf8');
process.stdin.once('data', function(val) {
fn(val.trim());
}).resume();
}
function scp(src, dest, defaults) {
console.log();
client.defaults(defaults);
client.scp(src, dest, function(err) {
if (err) {
console.error(err);
process.exit(1);
} else {
log('scp success');
}
console.log();
process.exit();
});
}
function pad(n) {
return n < 10 ? '0' + n.toString(10) : n.toString(10);
}
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
'Oct', 'Nov', 'Dec'];
// 26 Feb 16:19:34
function timestamp() {
var d = new Date();
var time = [pad(d.getHours()),
pad(d.getMinutes()),
pad(d.getSeconds())].join(':');
return [d.getDate(), months[d.getMonth()], time].join(' ');
}
function grey(msg) {
return ' \x1b[90m' + msg.toString() + '\x1b[39m';
}
function log(msg, r) {
msg = grey(timestamp()) + ' - ' + msg.toString();
process.stdout.write(msg + (r ? '\r' : '\n'));
}