diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/insomniaircd_webhook.rb | 50 | ||||
-rw-r--r-- | lib/insomniaircd_webhook/util.rb | 13 |
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 + |