#!/usr/bin/env node 'use strict' var wreck = require('wreck') var argv = process.argv.slice(2) var Promise = require('es6-promise') var pgp = require('pg-promise')({ promiseLib: Promise }) var inquirer = require('inquirer') var fs = require('fs') var cmd = argv[0] if (!cmd) bail() function bail () { console.log('Command line utility for lamassu-server') console.log('\nssu reboot ') console.log('This will remotely reboot your lamassu-machine.') console.log('\nssu crypto []') console.log('This will configure a new cryptocurrency.') console.log('\nssu config ') console.log('Configure a plugin setting.') process.exit(1) } switch (cmd) { case 'reboot': reboot() break case 'crypto': crypto() break case 'config': configure() break default: } function reboot () { var fingerprint = argv[1] if (!fingerprint) { console.log('Fingerprint required') process.exit(1) } var opts = {json: true} wreck.get('http://localhost:7070/pid?fingerprint=' + fingerprint, opts, function (err, res, payload) { if (err) { console.log('Please make sure that lamassu-server is running on this box.') process.exit(2) } if (!payload || !payload.pid) { console.log('The requested lamassu-machine appears to be running an old version.') process.exit(3) } var pid = payload.pid if (Date.now() - payload.ts > 10000) { console.log('lamassu-machine is not connected to server.') process.exit(6) } var opts2 = { headers: {'Content-Type': 'application/json'}, payload: JSON.stringify({pid: pid, fingerprint: fingerprint}) } wreck.post('http://localhost:7070/reboot', opts2, function (err2, res) { if (err2) { console.log('Please make sure that lamassu-server is running on this box.') process.exit(2) } if (res.statusCode !== 200) { console.log('Communication error') return } console.log('Rebooting...') var ts = null setTimeout(function () { if (Date.now() - ts < 10000) { console.log('lamassu-machine did not reboot but is still contacting server.') process.exit(4) } console.log('lamassu-machine rebooted but is not coming back up.') process.exit(5) }, 30000) setInterval(function () { wreck.get('http://localhost:7070/pid?fingerprint=' + fingerprint, opts, function (err3, res, payload) { if (err3) { console.log('lamassu-server appears to be down.') process.exit(2) } ts = payload.ts if (payload.pid !== pid) { console.log('lamassu-machine is back up!') process.exit(0) } }) }, 5000) }) }) } function crypto () { var code = argv[1] var tickerPlugin = argv[2] var walletPlugin = argv[3] var traderPlugin = argv[4] if (!code || !tickerPlugin || !walletPlugin) { console.log('\nssu crypto []') console.log('This will configure a new cryptocurrency.') process.exit(1) } code = code.toUpperCase() var psqlUrl try { psqlUrl = process.env.DATABASE_URL || JSON.parse(fs.readFileSync('/etc/lamassu.json')).postgresql } catch (ex) { psqlUrl = 'psql://lamassu:lamassu@localhost/lamassu' } var db = pgp(psqlUrl) return db.one('select data from user_config where type=$1', 'exchanges') .then(function (data) { var config = data.data config.exchanges.plugins.current[code] = { ticker: tickerPlugin, transfer: walletPlugin, trader: traderPlugin } config.exchanges.settings.coins = ['BTC', code] return db.none('update user_config set data=$1 where type=$2', [config, 'exchanges']) }) .then(function () { console.log('success') pgp.end() }) .catch(function (err) { console.log(err.stack) pgp.end() }) } function configure () { var plugin = argv[1] var key = argv[2] if (!plugin || !key) { console.log('\nssu config ') console.log('Configure a plugin setting.') process.exit(1) } inquirer.prompt([{ type: 'password', name: 'value', message: 'Enter value for ' + key + ': ', validate: function (val) { return !val || val.length === 0 ? 'Please enter a value for ' + key : true } }]).then(function (result) { var value = result.value var psqlUrl try { psqlUrl = process.env.DATABASE_URL || JSON.parse(fs.readFileSync('/etc/lamassu.json')).postgresql } catch (ex) { psqlUrl = 'psql://lamassu:lamassu@localhost/lamassu' } var db = pgp(psqlUrl) return db.one('select data from user_config where type=$1', 'exchanges') .then(function (data) { var config = data.data config.exchanges.plugins.settings[plugin] = config.exchanges.plugins.settings[plugin] || {} config.exchanges.plugins.settings[plugin][key] = value return db.none('update user_config set data=$1 where type=$2', [config, 'exchanges']) }) .then(function () { console.log('success') pgp.end() }) .catch(function (err) { console.log(err.stack) pgp.end() }) }) }