rats-search/src/background/ssh.js
Alexey Kasyanchuk fd4ba2c392 fix eslint
2018-06-18 00:06:28 +03:00

81 lines
1.5 KiB
JavaScript

const appPath = require('./electronAppPath')
const { spawn } = require('child_process')
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
}
let tryies = 5;
const startSSH = (port, host, user, password, callback) => {
let remotePort = getRandomInt(10000, 65000)
if(tryies-- <= 0)
{
if(callback)
callback(false)
return
}
const options = [
'-N',
'-T',
'-R', `0.0.0.0:${remotePort}:127.0.0.1:${port}`,
`${user}@${host}`,
'-pw', password,
'-v'
]
const ssh = spawn(appPath('plink'), options)
const checkMessage = (data) => {
if(data.includes(`Remote port forwarding from 0.0.0.0:${remotePort}`))
{
if(data.includes('refused'))
{
ssh.kill()
startSSH(port, host, user, password, callback)
}
else if(data.includes('enabled'))
{
if(callback)
callback({address: host, port: remotePort})
}
}
}
ssh.stdout.on('data', (data) => {
console.log(`ssh: ${data}`)
checkMessage(data)
if(data.includes('Store key in cache?'))
{
ssh.stdin.write("y")
ssh.stdin.end()
}
})
ssh.stderr.on('data', (data) => {
console.log(`ssh error: ${data}`);
checkMessage(data)
if(data.includes('Password authentication failed'))
{
ssh.kill()
}
if(data.includes('Store key in cache?'))
{
ssh.stdin.write("y")
ssh.stdin.end()
}
});
ssh.on('close', (code, signal) => {
console.log(`ssh closed with code ${code} and signal ${signal}`)
if(callback)
callback(false)
})
return ssh
}
module.exports = startSSH