mirror of
https://github.com/openstf/stf
synced 2025-10-04 02:09:32 +02:00
Add HipChat notifier role.
This commit is contained in:
parent
07f611b361
commit
4cf3d242a5
7 changed files with 134 additions and 1 deletions
39
lib/cli.js
39
lib/cli.js
|
@ -237,6 +237,45 @@ program
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
program
|
||||||
|
.command('notify-hipchat')
|
||||||
|
.description('start HipChat notifier')
|
||||||
|
.option('-t, --token <token>'
|
||||||
|
, 'HipChat v2 API token (or $HIPCHAT_TOKEN)'
|
||||||
|
, String
|
||||||
|
, process.env.HIPCHAT_TOKEN)
|
||||||
|
.option('-r, --room <room>'
|
||||||
|
, 'HipChat room (or $HIPCHAT_ROOM)'
|
||||||
|
, String
|
||||||
|
, process.env.HIPCHAT_ROOM)
|
||||||
|
.option('-p, --priority <level>'
|
||||||
|
, 'minimum log level'
|
||||||
|
, Number
|
||||||
|
, logger.Level.WARNING)
|
||||||
|
.option('-s, --connect-sub <endpoint>'
|
||||||
|
, 'sub endpoint'
|
||||||
|
, cliutil.list)
|
||||||
|
.action(function(options) {
|
||||||
|
if (!options.token) {
|
||||||
|
this.missingArgument('--token')
|
||||||
|
}
|
||||||
|
if (!options.room) {
|
||||||
|
this.missingArgument('--room')
|
||||||
|
}
|
||||||
|
if (!options.connectSub) {
|
||||||
|
this.missingArgument('--connect-sub')
|
||||||
|
}
|
||||||
|
|
||||||
|
require('./roles/notify/hipchat')({
|
||||||
|
token: options.token
|
||||||
|
, room: options.room
|
||||||
|
, priority: options.priority
|
||||||
|
, endpoints: {
|
||||||
|
sub: options.connectSub
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
program
|
program
|
||||||
.command('app')
|
.command('app')
|
||||||
.description('start app')
|
.description('start app')
|
||||||
|
|
|
@ -51,7 +51,7 @@ module.exports = function(options) {
|
||||||
|
|
||||||
// Forward all logs
|
// Forward all logs
|
||||||
logger.on('entry', function(entry) {
|
logger.on('entry', function(entry) {
|
||||||
push.send([wireutil.global,
|
push.send([wireutil.log,
|
||||||
wireutil.makeDeviceLogMessage(options.serial, entry)])
|
wireutil.makeDeviceLogMessage(options.serial, entry)])
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
81
lib/roles/notify/hipchat.js
Normal file
81
lib/roles/notify/hipchat.js
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
var util = require('util')
|
||||||
|
|
||||||
|
var Hipchatter = require('hipchatter')
|
||||||
|
var Promise = require('bluebird')
|
||||||
|
var zmq = require('zmq')
|
||||||
|
|
||||||
|
var logger = require('../../util/logger')
|
||||||
|
var wire = require('../../wire')
|
||||||
|
var wireutil = require('../../util/wireutil')(wire)
|
||||||
|
|
||||||
|
module.exports = function(options) {
|
||||||
|
var log = logger.createLogger('notify-hipchat')
|
||||||
|
var client = Promise.promisifyAll(new Hipchatter(options.token))
|
||||||
|
var buffer = []
|
||||||
|
, timer
|
||||||
|
|
||||||
|
// Input
|
||||||
|
var sub = zmq.socket('sub')
|
||||||
|
options.endpoints.sub.forEach(function(endpoint) {
|
||||||
|
log.info('Receiving input from %s', endpoint)
|
||||||
|
sub.connect(endpoint)
|
||||||
|
})
|
||||||
|
|
||||||
|
// Establish always-on channels
|
||||||
|
;[wireutil.log].forEach(function(channel) {
|
||||||
|
log.info('Subscribing to permanent channel "%s"', channel)
|
||||||
|
sub.subscribe(channel)
|
||||||
|
})
|
||||||
|
|
||||||
|
sub.on('message', function(channel, data) {
|
||||||
|
var wrapper = wire.Envelope.decode(data)
|
||||||
|
switch (wrapper.type) {
|
||||||
|
case wire.MessageType.DEVICE_LOG:
|
||||||
|
var message = wire.DeviceLogMessage.decode(wrapper.message)
|
||||||
|
if (message.priority >= options.priority) {
|
||||||
|
buffer.push(message)
|
||||||
|
clearTimeout(timer)
|
||||||
|
timer = setTimeout(push, 1000)
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
function push() {
|
||||||
|
var messages = buffer.splice(0).map(function(entry) {
|
||||||
|
return util.format(
|
||||||
|
'<strong>%s</strong>/<strong>%s</strong> %d [<strong>%s</strong>] %s'
|
||||||
|
, logger.LevelLabel[entry.priority]
|
||||||
|
, entry.tag
|
||||||
|
, entry.pid
|
||||||
|
, entry.identifier
|
||||||
|
, entry.message
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
log.info('Sending %d message(s)', messages.length)
|
||||||
|
|
||||||
|
return client.notifyAsync(process.env.HIPCHAT_ROOM, {
|
||||||
|
message: messages.join('<br>')
|
||||||
|
, color: 'purple'
|
||||||
|
, notify: true
|
||||||
|
, message_format: 'html'
|
||||||
|
, token: process.env.HIPCHAT_TOKEN
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function gracefullyExit() {
|
||||||
|
process.exit(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
process.on('SIGINT', function() {
|
||||||
|
gracefullyExit()
|
||||||
|
})
|
||||||
|
|
||||||
|
process.on('SIGTERM', function() {
|
||||||
|
gracefullyExit()
|
||||||
|
})
|
||||||
|
|
||||||
|
log.info('Listening for %s (or higher) level log messages',
|
||||||
|
logger.LevelLabel[options.priority])
|
||||||
|
}
|
|
@ -44,6 +44,7 @@ module.exports = function(options) {
|
||||||
case wire.MessageType.DEVICE_LOG:
|
case wire.MessageType.DEVICE_LOG:
|
||||||
var message = wire.DeviceLogMessage.decode(wrapper.message)
|
var message = wire.DeviceLogMessage.decode(wrapper.message)
|
||||||
dbapi.saveDeviceLog(message.serial, message)
|
dbapi.saveDeviceLog(message.serial, message)
|
||||||
|
appDealer.send([channel, data])
|
||||||
break
|
break
|
||||||
case wire.MessageType.DEVICE_POKE:
|
case wire.MessageType.DEVICE_POKE:
|
||||||
var message = wire.DevicePokeMessage.decode(wrapper.message)
|
var message = wire.DevicePokeMessage.decode(wrapper.message)
|
||||||
|
|
|
@ -106,6 +106,15 @@ Logger.Level = {
|
||||||
, FATAL: 6
|
, FATAL: 6
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Logger.LevelLabel = {
|
||||||
|
1: 'DBG'
|
||||||
|
, 2: 'VRB'
|
||||||
|
, 3: 'INF'
|
||||||
|
, 4: 'WRN'
|
||||||
|
, 5: 'ERR'
|
||||||
|
, 6: 'FTL'
|
||||||
|
}
|
||||||
|
|
||||||
Logger.globalIdentifier = '*'
|
Logger.globalIdentifier = '*'
|
||||||
|
|
||||||
Logger.createLogger = function(tag) {
|
Logger.createLogger = function(tag) {
|
||||||
|
|
|
@ -5,6 +5,7 @@ var uuid = require('node-uuid')
|
||||||
module.exports = function(wire) {
|
module.exports = function(wire) {
|
||||||
var wireutil = {
|
var wireutil = {
|
||||||
global: '*ALL'
|
global: '*ALL'
|
||||||
|
, log: '*LOG'
|
||||||
, makePrivateChannel: function() {
|
, makePrivateChannel: function() {
|
||||||
return uuid.v4(null, new Buffer(16)).toString('base64')
|
return uuid.v4(null, new Buffer(16)).toString('base64')
|
||||||
}
|
}
|
||||||
|
@ -63,6 +64,7 @@ module.exports = function(wire) {
|
||||||
, entry.tag
|
, entry.tag
|
||||||
, entry.pid
|
, entry.pid
|
||||||
, entry.message
|
, entry.message
|
||||||
|
, entry.identifier
|
||||||
)
|
)
|
||||||
|
|
||||||
return wireutil.envelope(wire.MessageType.DEVICE_LOG, message)
|
return wireutil.envelope(wire.MessageType.DEVICE_LOG, message)
|
||||||
|
|
|
@ -31,6 +31,7 @@ message DeviceLogMessage {
|
||||||
required string tag = 4;
|
required string tag = 4;
|
||||||
required uint32 pid = 5;
|
required uint32 pid = 5;
|
||||||
required string message = 6;
|
required string message = 6;
|
||||||
|
required string identifier = 7;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Introductions
|
// Introductions
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue