summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/insomniaircd_webhook.rb50
-rw-r--r--lib/insomniaircd_webhook/util.rb13
2 files changed, 63 insertions, 0 deletions
diff --git a/lib/insomniaircd_webhook.rb b/lib/insomniaircd_webhook.rb
new file mode 100644
index 0000000..1007607
--- /dev/null
+++ b/lib/insomniaircd_webhook.rb
@@ -0,0 +1,50 @@
+require 'json'
+require 'rack/utils'
+require 'sinatra'
+
+FileUtils.mkdir_p 'repos'
+
+post '/webhook' do
+ payload = request.body.read
+ verify_signature(payload)
+ data = JSON.parse(payload)
+
+ event = request.env['HTTP_X_GITHUB_EVENT']
+ if event == "ping"
+ ping data
+
+ elsif event == "push"
+ push data
+
+ else
+ 404
+ end
+end
+
+def ping(data)
+ "pong"
+end
+
+def push(data)
+ ref = data["ref"]
+ who = data["sender"]["login"]
+ repo = data["repository"]["name"]
+ url = data["repository"]["clone_url"]
+
+ puts "#{who} pushed to #{ref} on repository #{repo}"
+
+ if ref == 'refs/heads/master'
+ if generate_config repo, url
+ 200
+ else
+ 500
+ end
+ end
+end
+
+def verify_signature(payload_body)
+ if ENV['SECRET_TOKEN']
+ signature = 'sha1=' + OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'), ENV['SECRET_TOKEN'], payload_body)
+ return halt 500, "Signatures didn't match!" unless Rack::Utils.secure_compare(signature, request.env['HTTP_X_HUB_SIGNATURE'])
+ end
+end
diff --git a/lib/insomniaircd_webhook/util.rb b/lib/insomniaircd_webhook/util.rb
new file mode 100644
index 0000000..9b647b7
--- /dev/null
+++ b/lib/insomniaircd_webhook/util.rb
@@ -0,0 +1,13 @@
+
+def generate_config(repo, url)
+ if File.directory? "repos/#{repo}"
+ clone_success = system "cd repos/#{repo} && git pull"
+ else
+ clone_success = system "git clone #{url} repos/#{repo}"
+ end
+
+ if clone_success
+ system "cd repos/#{repo} && rake"
+ end
+end
+