BTC & LTC 0.17 and above change the account RPC such that unconfirmed deposits are not seen, and may affect availability of unconfirmed change. This happens on BCH 0.20.6 and above as well. Remain on older releases until new RPC calls are accounted for.
123 lines
3.1 KiB
JavaScript
123 lines
3.1 KiB
JavaScript
const crypto = require('crypto')
|
|
const os = require('os')
|
|
const path = require('path')
|
|
const cp = require('child_process')
|
|
const fs = require('fs')
|
|
|
|
const _ = require('lodash/fp')
|
|
|
|
const logger = require('console-log-level')({level: 'info'})
|
|
|
|
module.exports = {
|
|
es,
|
|
writeSupervisorConfig,
|
|
firewall,
|
|
randomPass,
|
|
fetchAndInstall,
|
|
logger,
|
|
isInstalledSoftware,
|
|
writeFile
|
|
}
|
|
|
|
const BINARIES = {
|
|
BTC: {
|
|
url: 'https://bitcoin.org/bin/bitcoin-core-0.16.3/bitcoin-0.16.3-x86_64-linux-gnu.tar.gz',
|
|
dir: 'bitcoin-0.16.3/bin'
|
|
},
|
|
ETH: {
|
|
url: 'https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.9.9-01744997.tar.gz',
|
|
dir: 'geth-linux-amd64-1.9.9-01744997'
|
|
},
|
|
ZEC: {
|
|
url: 'https://z.cash/downloads/zcash-2.1.0-1-linux64-debian-jessie.tar.gz',
|
|
dir: 'zcash-2.1.0-1/bin'
|
|
},
|
|
DASH: {
|
|
url: 'https://github.com/dashpay/dash/releases/download/v0.14.0.5/dashcore-0.14.0.5-x86_64-linux-gnu.tar.gz',
|
|
dir: 'dashcore-0.14.0/bin'
|
|
},
|
|
LTC: {
|
|
url: 'https://download.litecoin.org/litecoin-0.16.3/linux/litecoin-0.16.3-x86_64-linux-gnu.tar.gz',
|
|
dir: 'litecoin-0.16.3/bin'
|
|
},
|
|
BCH: {
|
|
url: 'https://download.bitcoinabc.org/0.20.5/linux/bitcoin-abc-0.20.5-x86_64-linux-gnu.tar.gz',
|
|
dir: 'bitcoin-abc-0.20.5/bin',
|
|
files: [['bitcoind', 'bitcoincashd'], ['bitcoin-cli', 'bitcoincash-cli']]
|
|
}
|
|
}
|
|
|
|
function firewall (ports) {
|
|
if (!ports || ports.length === 0) throw new Error('No ports supplied')
|
|
const portsString = ports.join(',')
|
|
es(`sudo ufw allow ${portsString}`)
|
|
}
|
|
|
|
function randomPass () {
|
|
return crypto.randomBytes(32).toString('hex')
|
|
}
|
|
|
|
function es (cmd) {
|
|
const env = {HOME: os.userInfo().homedir}
|
|
const options = {encoding: 'utf8', env}
|
|
const res = cp.execSync(cmd, options)
|
|
logger.debug(res)
|
|
return res.toString()
|
|
}
|
|
|
|
function writeSupervisorConfig (coinRec, cmd) {
|
|
if (isInstalledSoftware(coinRec)) return
|
|
|
|
const blockchain = coinRec.code
|
|
|
|
const supervisorConfig = `[program:${blockchain}]
|
|
command=nice ${cmd}
|
|
autostart=true
|
|
autorestart=true
|
|
stderr_logfile=/var/log/supervisor/${blockchain}.err.log
|
|
stdout_logfile=/var/log/supervisor/${blockchain}.out.log
|
|
environment=HOME="/root"
|
|
`
|
|
|
|
writeFile(`/etc/supervisor/conf.d/${coinRec.code}.conf`, supervisorConfig)
|
|
}
|
|
|
|
function isInstalledSoftware (coinRec) {
|
|
return fs.existsSync(`/etc/supervisor/conf.d/${coinRec.code}.conf`)
|
|
}
|
|
|
|
function fetchAndInstall (coinRec) {
|
|
if (isInstalledSoftware(coinRec)) return
|
|
|
|
const binaries = BINARIES[coinRec.cryptoCode]
|
|
if (!binaries) throw new Error(`No such coin: ${coinRec.code}`)
|
|
|
|
const url = binaries.url
|
|
const downloadFile = path.basename(url)
|
|
const binDir = binaries.dir
|
|
|
|
es(`wget -q ${url}`)
|
|
es(`tar -xzf ${downloadFile}`)
|
|
|
|
if (_.isEmpty(binaries.files)) {
|
|
es(`sudo cp ${binDir}/* /usr/local/bin`)
|
|
return
|
|
}
|
|
|
|
_.forEach(([source, target]) => {
|
|
es(`sudo cp ${binDir}/${source} /usr/local/bin/${target}`)
|
|
}, binaries.files)
|
|
}
|
|
|
|
function writeFile (path, content) {
|
|
try {
|
|
fs.writeFileSync(path, content)
|
|
} catch (err) {
|
|
if (err.code === 'EEXIST') {
|
|
logger.info(`${path} exists, skipping.`)
|
|
return
|
|
}
|
|
|
|
throw err
|
|
}
|
|
}
|