lamassu-server/lib/blockchain/common.js
naconner 8f5f40032c fix: downgrade BTC, BCH, LTC daemons
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.
2020-01-20 17:38:05 +01:00

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
}
}