Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@phumpal
Last active February 21, 2020 20:05
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save phumpal/45b035b816685131c9e09c88672c15ed to your computer and use it in GitHub Desktop.
Save phumpal/45b035b816685131c9e09c88672c15ed to your computer and use it in GitHub Desktop.
A simple Sinatra app to proxy Airbrake webhooks to Cisco Spark Rooms

Setup

brew install jq # or apt-get install jq (only needed for testing)          
rvm install ruby-2.4.1
rvm gemset create spark
rvm gemset use spark
gem install cisco_spark --no-document
gem install sinatra --no-document

Testing

Open two terminal sessions. In the first run ruby app.rb -b 0.0.0.0

In the second POST webhook.json to the Sinatra endpoint

curl -s -XPOST -H "Content-Type: application/json" \
  -d @webhook.json \
  "http://localhost:4567/event" | jq
#!/usr/bin/env ruby
require 'cisco_spark'
require 'sinatra'
CiscoSpark.configure do |config|
# https://developer.ciscospark.com/getting-started.html#authentication
config.api_key = 'YOUR_API_KEY_GOES_HERE'
end
# Room ID is a UUID. Either retrieve via the API or https://web.ciscospark.com/rooms/uuid-would-be-here
room = CiscoSpark::Room.fetch('YOUR-UUID-GOES-HERE')
post '/event' do
status 201
request.body.rewind
request_payload = JSON.parse(request.body.read)
# Expects https://airbrake.io/docs/integrations/webhooks/
message = CiscoSpark::Message.new(text: request_payload['airbrake_error_url'])
room.send_message(message)
end
upstream sinatra_app {
server 0.0.0.0:4567
}
server {
listen 443 ssl;
server_name myserver.name;
ssl_certificate /etc/ssl/myserver.name.crt;
ssl_certificate_key /etc/ssl/myserver.name.key;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1.2;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
location /event {
proxy_pass http://sinatra_app;
}
}
{
"error":{
"id":37463546,
"error_message":"KitchenException: You are all out of bacon!",
"error_class":"KitchenException",
"file":"[PROJECT_ROOT]/app/controllers/bacon_controller.rb",
"line_number":35,
"project":{
"id":1111,
"name":"Baconator"
},
"last_notice":{
"id":4505303522,
"request_method":null,
"request_url":"http://airbrake.io:445/bacon/cook",
"backtrace":[
"[PROJECT_ROOT]/app/controllers/bacon_controller.rb:35:in `cook'",
"[PROJECT_ROOT]/app/middleware/kitchen.rb:19:in `oven'",
"[PROJECT_ROOT]/app/middleware/kitchen.rb:33:in `chef'",
"[PROJECT_ROOT]/app/middleware/salumi.rb:23:in `store'"
]
},
"environment":"avocado",
"first_occurred_at":"2012-02-23T22:03:03Z",
"last_occurred_at":"2012-03-21T08:37:15Z",
"times_occurred":118
},
"airbrake_error_url": "https://airbrake.io/airbrake-error-url"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment