UNPKG

@lpezet/hpcc-cluster

Version:
115 lines (105 loc) 3.68 kB
const Fs = require('fs'); const net = require('net'); ModClass = function( pHpccCluster, pLogger, pUtils, pSSHClient ) { pHpccCluster.mod( 'scp', this, this.handle ); this.mRoot = pHpccCluster; this.mUtils = pUtils; this.mLogger = pLogger; this.mSSHClient = pSSHClient; } ModClass.prototype.handle = function( pConfig, pParameters ) { var that = this; return new Promise( function( resolve, reject ) { var source = pParameters.source; var target = pParameters.target; if ( (source.indexOf("@") < 0 && target.indexOf("@") < 0) || ( source.indexOf("@") >= 0 && target.indexOf("@") >= 0 ) ) { reject("<source> or <target> must contain remote host using '@', and only one. For example:\nscp local_file.txt ec2-user@1.2.3.4:/tmp/remote.txt\nThe command above would basically translate into:\nscp local_file.txt ec2-user@1.2.3.4:/tmp/remote.txt"); } else { that.mRoot.get_state().then( function( pState ) { that.mLogger.info('source=%s, target=%s', source, target); var create_public_ip_alias = function( pState ) { var alias = {}; for (var i in pState['Topology'] ) { alias[ '@' + i ] = that.mUtils.find_PublicIp( pState['Topology'][ i ] ); } return alias; } var oPublicIPAlias = create_public_ip_alias( pState ); /* var oAtRegex = /(@[^:]+):/; var append_user_and_resolve_host = function(pValue) { var oRes = pValue; if( oRes.indexOf("@") >= 0 && oRes.indexOf(":") > 0) { var oAtMatch = oRes.match( oAtRegex ); if ( oAtMatch ) { var oAt = oAtMatch[1]; var oPublicIP = oPublicIPAlias[ oAt ]; oRes = oRes.replace( oAt, '@' + oPublicIP ); } } return ( oRes.startsWith( "@" ) ? 'ec2-user' : '' ) + oRes; } source = append_user_and_resolve_host( source ); target = append_user_and_resolve_host( target ); */ var oTargetHostRegex = /(^[^:]+):/; var oTargetHostMatch = target.match( oTargetHostRegex ); var oUsername = null; var oTargetHost = null; if ( oTargetHostMatch ) { var oTargetHostParts = oTargetHostMatch[1].split('@'); oUsername = oTargetHostParts[0]; oTargetHost = oTargetHostParts[1]; if ( oUsername === '' ) { reject(new Error('Must specify username in remote.')); } var oPublicIP = oTargetHost; if ( !net.isIP( oTargetHost ) ) { oPublicIP = oPublicIPAlias[ '@' + oTargetHost ]; } oTargetHost = oPublicIP; target = target.replace( oTargetHostMatch[1], '' ).substring( 1 ); } else { //???? } //console.log('source = ' + source + ', target = ' + target + ', targetHost = ' + oTargetHost + ', username = ' + oUsername); const oClientOpts = { host: oTargetHost, username: oUsername, port: 22, privateKey: Fs.readFileSync( pConfig.KeyPairFile ) }; try { that.mSSHClient.scpFile( oClientOpts, target, source, function(err, stdout, stderr, server, conn) { if ( err ) { reject( err ); return; } resolve( stdout ); }); /* const oSCP = require('scp2'); oClient = new oSCP.Client({ port: 22, privateKey: require('fs').readFileSync( pConfig.KeyPairFile ) }); winston.log('debug', 'scp: { source: ' + source + ', target: ' + target + ' }...'); oSCP.scp( source, target, oClient, function(err) { if ( err ) { reject( err ); } else { console.log('done.'); resolve('scp done.'); } }); */ } catch (e) { reject( e ); } }, function( pError ) { reject( pError ); }); } }); }; exports = module.exports = ModClass;