add notification plugins

This commit is contained in:
Josh Harvey 2016-04-22 19:22:34 +03:00
parent 7e15308499
commit a8b75ca4d2
7 changed files with 123 additions and 126 deletions

55
bin/ssu
View file

@ -28,6 +28,10 @@ function bail (error) {
console.log('This will activate or deactivate a cryptocurrency.') console.log('This will activate or deactivate a cryptocurrency.')
console.log('\nssu config <plugin> <key>') console.log('\nssu config <plugin> <key>')
console.log('Configure a plugin setting.') console.log('Configure a plugin setting.')
console.log('\nssu notify [email] [sms]')
console.log('Set notification plugin types.')
console.log('\nssu set <plugin type> <plugin>')
console.log('Set current plugin for plugin type.')
process.exit(1) process.exit(1)
} }
@ -41,6 +45,12 @@ switch (cmd) {
case 'config': case 'config':
configure() configure()
break break
case 'notify':
notify()
break
case 'set':
setPlugin()
break
default: default:
bail('No such command: ' + cmd) bail('No such command: ' + cmd)
break break
@ -269,3 +279,48 @@ function configure () {
}) })
}) })
} }
function notify () {
var plugins = argv.slice(1)
var db = connect()
return loadConfig(db)
.then(function (config) {
config.exchanges.plugins.current.notify = JSON.stringify(plugins)
return updateConfig(db, config)
})
.then(function () {
console.log('success')
pgp.end()
})
.catch(function (err) {
console.log(err.stack)
pgp.end()
})
}
function setPlugin () {
var pluginType = argv[1]
var plugin = argv[2]
var db = connect()
return loadConfig(db)
.then(function (config) {
if (!plugin) {
var _plugin = config.exchanges.plugins.current[pluginType]
_plugin
? console.log('Current plugin for %s: %s', pluginType, _plugin)
: console.log('No plugin set for %s', pluginType)
process.exit(0)
}
config.exchanges.plugins.current[pluginType] = plugin
return updateConfig(db, config)
})
.then(function () {
console.log('success')
pgp.end()
})
.catch(function (err) {
console.log(err.stack)
pgp.end()
})
}

31
dev/send-message.js Normal file
View file

@ -0,0 +1,31 @@
require('es6-promise').polyfill()
var config = require('../lib/config')
var plugins = require('../lib/plugins')
var rand = Math.floor(Math.random() * 1e6)
var rec = {
email: {
toEmail: 'joshmh@gmail.com',
subject: 'Test email ' + rand,
body: 'This is a test email from lamassu-server'
},
sms: {
toNumber: process.argv[2],
body: '[Lamassu] This is a test sms ' + rand
}
}
var db = config.connection
config.loadConfig(db)
.then(function (config) {
plugins.configure(config)
plugins.sendMessage(rec)
.then(function () {
console.log('Success.')
})
.catch(function (err) {
console.log(err.stack)
})
})

View file

@ -1,4 +1,3 @@
require('es6-promise').polyfill()
var fs = require('fs') var fs = require('fs')
var pgp = require('pg-promise')() var pgp = require('pg-promise')()

View file

@ -1,48 +0,0 @@
var SMTPConnection = require('smtp-connection')
var Config = require('./config')
/*
Nice job signing up! Let's finish getting you set up.
Simply change the settings in your email software to these:
SMTP Server: mail.smtp2go.com
SMTP Port: 2525 (recommended)
Username: josh@lamassu.is
Password: view / edit
*/
var options = {
port: 2525,
host: 'mail.smtp2go.com',
requireTLS: true
}
function send (from, to, subject, body, cb) {
Config.loadConfig()
.then(function (config) {
var _config = config.exchanges.plugins.settings.email
var user = _config.user
var pass = _config.pass
var connection = new SMTPConnection(options)
connection.connect(function () {
connection.login({user: user, pass: pass}, function (err) {
if (err) return console.error(err)
var envelope = {
from: from,
to: to
}
var message = 'Subject: ' + subject + '\n\n' + body
connection.send(envelope, message, function (err, info) {
connection.quit()
cb(err, info)
})
})
})
})
}
send('josh@lamassu.is', 'joshmh@gmail.com', 'Another test', 'Screen is stale.\n\nTest4', function (err, info) {
console.log(err)
console.log(info)
})

View file

@ -29,6 +29,8 @@ var traderPlugins = {}
var walletPlugins = {} var walletPlugins = {}
var idVerifierPlugin = null var idVerifierPlugin = null
var infoPlugin = null var infoPlugin = null
var emailPlugin = null
var smsPlugin = null
var currentlyUsedPlugins = {} var currentlyUsedPlugins = {}
@ -61,7 +63,8 @@ function loadPlugin (name, config) {
trader: ['purchase', 'sell'], trader: ['purchase', 'sell'],
wallet: ['balance', 'sendBitcoins', 'newAddress'], wallet: ['balance', 'sendBitcoins', 'newAddress'],
idVerifier: ['verifyUser', 'verifyTransaction'], idVerifier: ['verifyUser', 'verifyTransaction'],
info: ['checkAddress'] info: ['checkAddress'],
email: ['sendMessage']
} }
var plugin = null var plugin = null
@ -106,7 +109,7 @@ function loadPlugin (name, config) {
'\' fails to implement *recommended* \'config\' method')) '\' fails to implement *recommended* \'config\' method'))
plugin.config = function () {} plugin.config = function () {}
} else if (config !== null) { } else if (config !== null) {
plugin.config(config) // only when plugin supports it, and config is passed plugin.config(config, logger) // only when plugin supports it, and config is passed
} }
return plugin return plugin
@ -144,7 +147,9 @@ function loadOrConfigPlugin (pluginHandle, pluginType, cryptoCode, currency,
return pluginHandle return pluginHandle
} }
exports.loadOrConfigPlugin = loadOrConfigPlugin
// Note: this whole function gets called every time there's a config update
exports.configure = function configure (config) { exports.configure = function configure (config) {
if (config.exchanges.settings.lowBalanceMargin < 1) { if (config.exchanges.settings.lowBalanceMargin < 1) {
throw new Error('\'settings.lowBalanceMargin\' has to be >= 1') throw new Error('\'settings.lowBalanceMargin\' has to be >= 1')
@ -204,7 +209,18 @@ exports.configure = function configure (config) {
infoPlugin, infoPlugin,
'info' 'info'
) )
emailPlugin = loadOrConfigPlugin(
emailPlugin,
'email'
)
smsPlugin = loadOrConfigPlugin(
smsPlugin,
'sms'
)
} }
exports.getConfig = function getConfig () { exports.getConfig = function getConfig () {
return cachedConfig return cachedConfig
} }
@ -613,3 +629,18 @@ exports.verifyTx = function verifyTx (data, cb) {
exports.getcryptoCodes = function getcryptoCodes () { exports.getcryptoCodes = function getcryptoCodes () {
return cryptoCodes return cryptoCodes
} }
exports.sendMessage = function sendMessage (rec, cb) {
console.log('DEBUG5')
cb = cb || function () {}
console.log(cachedConfig.exchanges.plugins.current.notify)
var pluginTypes = JSON.parse(cachedConfig.exchanges.plugins.current.notify)
console.log('DEBUG7')
console.log(pluginTypes)
var pluginPromises = pluginTypes.map(function (pluginType) {
if (pluginType === 'email') return emailPlugin.sendMessage(rec, cb)
if (pluginType === 'sms') return smsPlugin.sendMessage(rec, cb)
throw new Error('No such plugin type: ' + pluginType)
})
return Promise.all(pluginPromises)
}

View file

@ -1,22 +0,0 @@
var Client = require('twilio')
var Config = require('./config')
var toNumber = process.argv[2]
Config.loadConfig()
.then(function (config) {
var _config = config.exchanges.plugins.settings.sms
var accountSid = _config.accountSid
var authToken = _config.authToken
var fromNumber = _config.fromNumber
var client = Client(accountSid, authToken)
client.messages.create({
body: '[Lamassu] ALERT Stale screen: acceptingFirstBill',
to: toNumber,
from: fromNumber
}, function (err, message) {
console.log(err)
console.log(message)
})
})

View file

@ -1,53 +1,4 @@
- getDeviceRate should return bignumber - configure email, sms or both for notification
- test with l-m - integrate email and sms into notifications
- run notifications from server
backwards compatibility: - don't keep sending notifications when state persists -- keep variable in memory
- new l-m must be backwards compatible with old l-s
- clean up db stuff satoshis/cryptoAtoms
- clean up other stuff
- add 'ETH' to config in ssu crypto: config.exchanges.settings.coins
[2016-04-06T19:58:17.827Z] ERROR: lamassu-server/39374 on MacBook-Pro: null value in column "satoshis" violates not-null constraint
error: null value in column "satoshis" violates not-null constraint
at Connection.parseE (/Users/josh/projects/lamassu-server/node_modules/pg/lib/connection.js:539:11)
at Connection.parseMessage (/Users/josh/projects/lamassu-server/node_modules/pg/lib/connection.js:366:17)
at Socket.<anonymous> (/Users/josh/projects/lamassu-server/node_modules/pg/lib/connection.js:105:22)
at Socket.emit (events.js:95:17)
at Socket.<anonymous> (_stream_readable.js:765:14)
at Socket.emit (events.js:92:17)
at emitReadable_ (_stream_readable.js:427:10)
at emitReadable (_stream_readable.js:423:5)
at readableAddChunk (_stream_readable.js:166:9)
at Socket.Readable.push (_stream_readable.js:128:10)
alter table transactions alter satoshis TYPE bigint;
alter table transactions add crypto_code text default 'BTC';
alter table pending_transactions add crypto_code text default 'BTC';
alter table pending_transactions alter satoshis TYPE bigint;
alter table bills add crypto_code text default 'BTC';
alter table bills alter satoshis TYPE bigint;
- handle geth send failure better
- remove debug
- implement coin selection screen
- ask neal to work on config scripts
[2016-04-17T22:10:57.917Z] ERROR: lamassu-server/32185 on MacBook-Pro.local: could not unlock signer account
Error: could not unlock signer account
at Object.module.exports.InvalidResponse (/Users/josh/projects/lamassu-geth/node_modules/web3/lib/web3/errors.js:35:16)
at /Users/josh/projects/lamassu-geth/node_modules/web3/lib/web3/requestmanager.js:86:36
at request.onreadystatechange (/Users/josh/projects/lamassu-geth/node_modules/web3/lib/web3/httpprovider.js:114:13)
at dispatchEvent (/Users/josh/projects/lamassu-geth/node_modules/web3/node_modules/xmlhttprequest/lib/XMLHttpRequest.js:591:25)
at setState (/Users/josh/projects/lamassu-geth/node_modules/web3/node_modules/xmlhttprequest/lib/XMLHttpRequest.js:610:14)
at IncomingMessage.<anonymous> (/Users/josh/projects/lamassu-geth/node_modules/web3/node_modules/xmlhttprequest/lib/XMLHttpRequest.js:447:13)
at emitNone (events.js:72:20)
at IncomingMessage.emit (events.js:166:7)
at endReadableNT (_stream_readable.js:913:12)
at nextTickCallbackWith2Args (node.js:442:9)
/Users/josh/projects/lamassu-server/lib/postgresql_interface.js:301
satoshis.toString(),
^
better handling of this error