diff --git a/lib/blockchain/bitcoin.js b/lib/blockchain/bitcoin.js index 88e38988..c8a3d8b8 100644 --- a/lib/blockchain/bitcoin.js +++ b/lib/blockchain/bitcoin.js @@ -4,7 +4,7 @@ const { utils: coinUtils } = require('lamassu-coins') const common = require('./common') -module.exports = {setup} +module.exports = { setup, updateCore } const coinRec = coinUtils.getCryptoCurrency('BTC') @@ -16,6 +16,23 @@ function setup (dataDir) { common.writeSupervisorConfig(coinRec, cmd) } +function updateCore (coinRec) { + common.logger.info('Updating Bitcoin Core. This may take a minute.') + common.es(`supervisorctl stop bitcoin`) + common.es(`curl -#o /tmp/bitcoin.tar.gz ${coinRec.url}`) + common.es(`tar -xzf /tmp/bitcoin.tar.gz -C /tmp/`) + + common.logger.info('Updating wallet...') + common.es(`cp /tmp/${coinRec.dir}/* /usr/local/bin/`) + common.es(`rm -r /tmp/${coinRec.dir.replace('/bin', '')}`) + common.es(`rm /tmp/bitcoin.tar.gz`) + + common.logger.info('Starting wallet...') + common.es(`supervisorctl start bitcoin`) + + common.logger.info('Bitcoin Core is updated!') +} + function buildConfig () { return `rpcuser=lamassuserver rpcpassword=${common.randomPass()} diff --git a/lib/blockchain/common.js b/lib/blockchain/common.js index 2c0bdc3c..53cc6262 100644 --- a/lib/blockchain/common.js +++ b/lib/blockchain/common.js @@ -3,6 +3,7 @@ const os = require('os') const path = require('path') const cp = require('child_process') const fs = require('fs') +const btc = require('./bitcoin') const _ = require('lodash/fp') @@ -16,13 +17,17 @@ module.exports = { fetchAndInstall, logger, isInstalledSoftware, - writeFile + writeFile, + getBinaries, + isUpdateDependent } const BINARIES = { BTC: { - url: 'https://bitcoincore.org/bin/bitcoin-core-0.20.1/bitcoin-0.20.1-x86_64-linux-gnu.tar.gz', - dir: 'bitcoin-0.20.1/bin' + defaultUrl: 'https://bitcoincore.org/bin/bitcoin-core-0.20.0/bitcoin-0.20.0-x86_64-linux-gnu.tar.gz', + defaultDir: 'bitcoin-0.20.0/bin', + url: 'https://bitcoincore.org/bin/bitcoin-core-0.21.0/bitcoin-0.21.0-x86_64-linux-gnu.tar.gz', + dir: 'bitcoin-0.21.0/bin' }, ETH: { url: 'https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.9.25-e7872729.tar.gz', @@ -47,6 +52,8 @@ const BINARIES = { } } +const coinsUpdateDependent = ['BTC'] + function firewall (ports) { if (!ports || ports.length === 0) throw new Error('No ports supplied') const portsString = ports.join(',') @@ -87,14 +94,15 @@ function isInstalledSoftware (coinRec) { } function fetchAndInstall (coinRec) { + const requiresUpdate = isUpdateDependent(coinRec.code) if (isInstalledSoftware(coinRec)) return const binaries = BINARIES[coinRec.cryptoCode] if (!binaries) throw new Error(`No such coin: ${coinRec.code}`) - const url = binaries.url + const url = requiresUpdate ? binaries.defaultUrl : binaries.url const downloadFile = path.basename(url) - const binDir = binaries.dir + const binDir = requiresUpdate ? binaries.defaultDir : binaries.dir es(`wget -q ${url}`) es(`tar -xzf ${downloadFile}`) @@ -121,3 +129,13 @@ function writeFile (path, content) { throw err } } + +function getBinaries (coinCode) { + const binaries = BINARIES[coinCode] + if (!binaries) throw new Error(`No such coin: ${coinCode}`) + return binaries +} + +function isUpdateDependent (coinCode) { + return _.includes(coinCode, coinsUpdateDependent) +} diff --git a/lib/blockchain/install.js b/lib/blockchain/install.js index 8a71a826..3a8df46b 100644 --- a/lib/blockchain/install.js +++ b/lib/blockchain/install.js @@ -69,6 +69,8 @@ function processCryptos (codes) { ) | crontab -` common.es(rsyncCmd) + _.forEach(updateCrypto, selectedCryptos) + logger.info('Installation complete.') } @@ -91,6 +93,12 @@ function setupCrypto (crypto) { process.chdir(oldDir) } +function updateCrypto (crypto) { + if (!common.isUpdateDependent(crypto)) return + const cryptoPlugin = plugin(crypto) + cryptoPlugin.updateCore(common.getBinaries(crypto)) +} + function plugin (crypto) { const plugin = PLUGINS[crypto.cryptoCode] if (!plugin) throw new Error(`No such plugin: ${crypto.cryptoCode}`)