site_hook 0.8.2 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/.rspec +0 -2
- data/.rubocop.yml +2 -0
- data/Gemfile +1 -5
- data/Rakefile +35 -3
- data/bin/site_hook +5 -1
- data/features/get_help.feature +3 -0
- data/features/step_definitions/get_help_step_definition.rb +1 -0
- data/features/step_definitions/my_steps.rb +3 -0
- data/features/support/env.rb +1 -0
- data/lib/site_hook.rb +2 -28
- data/lib/site_hook/cli.rb +22 -39
- data/lib/site_hook/commands/config_class.rb +22 -68
- data/lib/site_hook/commands/jekyll_class.rb +38 -0
- data/lib/site_hook/commands/server_class.rb +38 -34
- data/lib/site_hook/config.rb +390 -14
- data/lib/site_hook/config_sections.rb +60 -9
- data/lib/site_hook/deprecate.rb +34 -11
- data/lib/site_hook/env/env.rb +2 -0
- data/lib/site_hook/exceptions.rb +26 -2
- data/lib/site_hook/log.rb +20 -15
- data/lib/site_hook/logger.rb +94 -173
- data/lib/site_hook/loggers.rb +10 -0
- data/lib/site_hook/loggers/access.rb +20 -0
- data/lib/site_hook/loggers/app.rb +78 -0
- data/lib/site_hook/loggers/build.rb +77 -0
- data/lib/site_hook/loggers/fake.rb +52 -0
- data/lib/site_hook/loggers/git.rb +81 -0
- data/lib/site_hook/loggers/hook.rb +74 -0
- data/lib/site_hook/methods.rb +26 -0
- data/lib/site_hook/paths.rb +65 -2
- data/lib/site_hook/prelogger.rb +88 -0
- data/lib/site_hook/prompt.rb +14 -0
- data/lib/site_hook/prompts/prompt_project.rb +48 -0
- data/lib/site_hook/runner.rb +36 -0
- data/lib/site_hook/sender.rb +4 -9
- data/lib/site_hook/string_ext.rb +57 -0
- data/lib/site_hook/version.rb +2 -2
- data/lib/site_hook/webhook.rb +120 -129
- data/site_hook.gemspec +39 -22
- data/spec/spec_helper.rb +13 -0
- data/spec/string_ext_spec.rb +10 -0
- metadata +87 -85
- data/CODE_OF_CONDUCT.md +0 -74
- data/bin/console +0 -14
- data/lib/site_hook/assets/css/styles.css +0 -26
- data/lib/site_hook/commands/debug_class.rb +0 -29
- data/lib/site_hook/config_sections/cli.rb +0 -24
- data/lib/site_hook/config_sections/log_levels.rb +0 -15
- data/lib/site_hook/config_sections/projects.rb +0 -22
- data/lib/site_hook/const.rb +0 -10
- data/lib/site_hook/gem.rb +0 -26
- data/lib/site_hook/persist.rb +0 -14
- data/lib/site_hook/prompts/gen_config.rb +0 -48
- data/lib/site_hook/spinner.rb +0 -19
- data/lib/site_hook/views/layout.haml +0 -24
- data/lib/site_hook/views/webhooks.haml +0 -7
@@ -0,0 +1,88 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2019 Ken Spencer / IotaSpencer <me@iotaspencer.me>
|
3
|
+
#
|
4
|
+
# File: /lib/site_hook/prelogger.rb
|
5
|
+
# Created: 3/9/19
|
6
|
+
#
|
7
|
+
# License is in project root, MIT License is in use.
|
8
|
+
|
9
|
+
require 'site_hook/paths'
|
10
|
+
module SiteHook
|
11
|
+
class PreLogger
|
12
|
+
def initialize(input, output, errput)
|
13
|
+
self.class.set_base_default
|
14
|
+
@@levels = {
|
15
|
+
unknown: ::Logger::UNKNOWN,
|
16
|
+
fatal: ::Logger::FATAL,
|
17
|
+
error: ::Logger::ERROR,
|
18
|
+
info: ::Logger::INFO,
|
19
|
+
debug: ::Logger::DEBUG
|
20
|
+
}
|
21
|
+
@@loggers = {
|
22
|
+
stdout: ::Logger.new(STDOUT, progname: @@base),
|
23
|
+
stderr: ::Logger.new(STDERR, progname: @@base),
|
24
|
+
file: ::Logger.new(SiteHook::Paths.make_log_name(self.to_s), progname: @@base)
|
25
|
+
}
|
26
|
+
@@loggers.each do |_logger, obj|
|
27
|
+
obj.datetime_format = '%Y-%m-%dT%H:%M:%S%Z'
|
28
|
+
obj.formatter = proc do |severity, datetime, progname, msg|
|
29
|
+
"#{severity} [#{datetime}] #{progname} —— #{msg}\n"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
def self.base=(base)
|
34
|
+
@@base = base.to_s
|
35
|
+
end
|
36
|
+
def self.set_base_default
|
37
|
+
@@base = 'Logger'
|
38
|
+
end
|
39
|
+
def self.unknown(obj)
|
40
|
+
@@loggers.each do |_key, value|
|
41
|
+
value.unknown(obj)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.error(obj)
|
46
|
+
@@loggers.each do |_key, value|
|
47
|
+
value.error(obj)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.info(obj)
|
52
|
+
@@loggers.each do |key, value|
|
53
|
+
next if key == :stderr
|
54
|
+
value.info(obj)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.debug(obj)
|
59
|
+
@@loggers.each do |_key, value|
|
60
|
+
value.debug(obj)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
def self.fatal(obj)
|
64
|
+
@@loggers.each do |key, value|
|
65
|
+
next if key == :stderr
|
66
|
+
value.fatal(obj)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
# @param [Symbol] level log level to log at
|
73
|
+
# @param [Object] obj some kind of object or msg to log
|
74
|
+
def self.log(level, obj)
|
75
|
+
@@loggers.each do |logger|
|
76
|
+
logger.add(@levels[level], obj)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.<<(msg)
|
81
|
+
@@loggers.each do |logger|
|
82
|
+
logger.<<(msg)
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
##
|
2
|
+
#
|
3
|
+
# Copyright 2019 Ken Spencer / IotaSpencer
|
4
|
+
#
|
5
|
+
#
|
6
|
+
# File: prompt_project.rb
|
7
|
+
# Created: 2/15/19
|
8
|
+
#
|
9
|
+
# License is in project root, MIT License is in use.
|
10
|
+
##
|
11
|
+
|
12
|
+
require 'highline'
|
13
|
+
require 'site_hook/prompt'
|
14
|
+
module SiteHook
|
15
|
+
module Prompts
|
16
|
+
class Project < ::SiteHook::Prompt
|
17
|
+
runnable [:prompt_name, :prompt_src_path]
|
18
|
+
@@hl = HighLine.new($stdin, $stdout, 0, 0, 0, 0)
|
19
|
+
desc 'Prompts for project details'
|
20
|
+
def prompt_name
|
21
|
+
@@hl.say(<<~STATEMENT)
|
22
|
+
What's the name of the project?
|
23
|
+
STATEMENT
|
24
|
+
@@hl.choose do |menu|
|
25
|
+
menu.confirm = 'Are you sure? '
|
26
|
+
menu.select_by = :index_or_name
|
27
|
+
menu.index = '*'
|
28
|
+
menu.prompt = '> '
|
29
|
+
menu.flow = :rows
|
30
|
+
menu.default = Pathname.new(`pwd`).basename.to_s.chomp!
|
31
|
+
menu.choice(Pathname.new(`pwd`).basename.to_s.chomp!) do |answer|
|
32
|
+
@project_name = answer
|
33
|
+
end
|
34
|
+
menu.choice('Custom / Input your own?') do
|
35
|
+
@project_name = @@hl.ask('> ', String) do |q|
|
36
|
+
q.confirm = true
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
def prompt_src_path
|
42
|
+
@@hl.say(<<~STATEMENT)
|
43
|
+
What's the src path?
|
44
|
+
STATEMENT
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'site_hook'
|
2
|
+
require 'site_hook/logger'
|
3
|
+
module SiteHook
|
4
|
+
class Runner
|
5
|
+
def initialize(argv = ARGV, stdin = STDIN, stdout = STDOUT, stderr = STDERR, kernel = Kernel)
|
6
|
+
@argv, @stdin, @stdout, @stderr, @kernel = argv, stdin, stdout, stderr, kernel
|
7
|
+
end
|
8
|
+
def execute!
|
9
|
+
exit_code = begin
|
10
|
+
$stderr = @stderr
|
11
|
+
$stdin = @stdin
|
12
|
+
$stdout = @stdout
|
13
|
+
SiteHook::PreLogger.new($stdin, $stdout, $stderr)
|
14
|
+
SiteHook::Config.new
|
15
|
+
SiteHook::Log.new($stdin, $stdout, $stderr)
|
16
|
+
SiteHook::CLI.start(@argv)
|
17
|
+
0
|
18
|
+
|
19
|
+
rescue StandardError => e
|
20
|
+
b = e.backtrace
|
21
|
+
STDERR.puts("#{b.shift}: #{e.message} (#{e.class})")
|
22
|
+
STDERR.puts(b.map{|s| "\tfrom #{s}"}.join("\n"))
|
23
|
+
1
|
24
|
+
rescue SystemExit => e
|
25
|
+
STDERR.puts e.status
|
26
|
+
1
|
27
|
+
ensure
|
28
|
+
|
29
|
+
$stderr = STDERR
|
30
|
+
$stdin = STDIN
|
31
|
+
$stdout = STDOUT
|
32
|
+
end
|
33
|
+
@kernel.exit(exit_code)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/site_hook/sender.rb
CHANGED
@@ -2,10 +2,7 @@ require 'open3'
|
|
2
2
|
require 'site_hook/logger'
|
3
3
|
require 'git'
|
4
4
|
require 'paint'
|
5
|
-
require 'site_hook/persist'
|
6
5
|
module SiteHook
|
7
|
-
autoload :Logs, 'site_hook/log'
|
8
|
-
|
9
6
|
module Senders
|
10
7
|
class Jekyll
|
11
8
|
attr :jekyll_source, :build_dest
|
@@ -30,8 +27,8 @@ module SiteHook
|
|
30
27
|
end
|
31
28
|
|
32
29
|
def do_pull
|
33
|
-
fakelog = SiteHook::
|
34
|
-
reallog = SiteHook::
|
30
|
+
fakelog = SiteHook::Log.fake
|
31
|
+
reallog = SiteHook::Log.git
|
35
32
|
jekyll_source = Jekyll.instance_variable_get(JEKYLL_SOURCE_VAR)
|
36
33
|
# build_dest = Jekyll.instance_variable_get('@build_dest')
|
37
34
|
g = Git.open(jekyll_source, log: fakelog)
|
@@ -46,7 +43,7 @@ module SiteHook
|
|
46
43
|
build_dest = Jekyll.instance_variable_get('@build_dest')
|
47
44
|
log = Jekyll.instance_variable_get('@log')
|
48
45
|
Open3.popen2e({'BUNDLE_GEMFILE' => Pathname(jekyll_source).join('Gemfile').to_path}, "bundle exec jekyll build --source #{Pathname(jekyll_source).realdirpath.to_path} --destination #{Pathname(build_dest).to_path} --config #{Pathname(jekyll_source).join(@options[:config])}") { |in_io, outerr_io, thr|
|
49
|
-
|
46
|
+
pid = thr.pid
|
50
47
|
|
51
48
|
outerr = outerr_io.read.lines
|
52
49
|
outerr.each do |line|
|
@@ -89,12 +86,10 @@ module SiteHook
|
|
89
86
|
@log = logger
|
90
87
|
@options = options
|
91
88
|
instance = self::Build.new(options)
|
92
|
-
meths = [
|
89
|
+
meths = [:do_grab_version, :do_pull, :do_build]
|
93
90
|
begin
|
94
91
|
meths.each do |m|
|
95
|
-
@log.debug("Running #{m}")
|
96
92
|
instance.send(m)
|
97
|
-
@log.debug("Ran #{m}")
|
98
93
|
end
|
99
94
|
return {message: 'success', status: 0}
|
100
95
|
rescue TypeError => e
|
@@ -0,0 +1,57 @@
|
|
1
|
+
class String
|
2
|
+
def squish!
|
3
|
+
strip!
|
4
|
+
gsub!(/\s+/, ' ')
|
5
|
+
self
|
6
|
+
end
|
7
|
+
def squish
|
8
|
+
dup.squish!
|
9
|
+
end
|
10
|
+
def underscore!
|
11
|
+
self unless /[A-Z-]|::/.match?(self)
|
12
|
+
self.to_s.gsub!("::".freeze, "/".freeze)
|
13
|
+
self.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2'.freeze)
|
14
|
+
self.gsub!(/([a-z\d])([A-Z])/, '\1_\2'.freeze)
|
15
|
+
self.tr!("-".freeze, "_".freeze)
|
16
|
+
self.downcase!
|
17
|
+
self
|
18
|
+
end
|
19
|
+
def underscore
|
20
|
+
dup.underscore!
|
21
|
+
end
|
22
|
+
def camelcase!
|
23
|
+
to_s.scan(/\w+/).collect(&:capitalize).join
|
24
|
+
end
|
25
|
+
def camelcase
|
26
|
+
dup.camelcase!
|
27
|
+
end
|
28
|
+
def camelize!
|
29
|
+
to_s.split(/_|\s+/).collect(&:capitalize).join
|
30
|
+
end
|
31
|
+
def camelize
|
32
|
+
dup.camelize!
|
33
|
+
end
|
34
|
+
def safe_log_name
|
35
|
+
self.split('::').last.underscore
|
36
|
+
end
|
37
|
+
end
|
38
|
+
module SiteHook
|
39
|
+
module StrExt
|
40
|
+
def StrExt.mkvar(inspection)
|
41
|
+
inspection.to_s.tr('.', '_').tr(' ', '_')
|
42
|
+
end
|
43
|
+
def StrExt.mkatvar(inspection)
|
44
|
+
inspection.dup.to_s.insert(0, '@').to_sym
|
45
|
+
end
|
46
|
+
def StrExt.mkatatvar(inspection)
|
47
|
+
inspection.to_s.insert(0, '@').insert(0, '@').to_sym
|
48
|
+
end
|
49
|
+
def StrExt.rematvar(inspection)
|
50
|
+
inspection.to_s.tr('@', '')
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.mkmvar(inspection)
|
54
|
+
inspection.to_s.tr('@', '').to_sym
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/lib/site_hook/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module SiteHook
|
2
|
-
VERSION =
|
3
|
-
end
|
2
|
+
VERSION = '0.9.3'
|
3
|
+
end
|
data/lib/site_hook/webhook.rb
CHANGED
@@ -1,28 +1,22 @@
|
|
1
1
|
##########
|
2
|
-
# -> File: /
|
2
|
+
# -> File: /site_hook/lib/site_hook/webhook.rb
|
3
3
|
# -> Project: site_hook
|
4
4
|
# -> Author: Ken Spencer <me@iotaspencer.me>
|
5
5
|
# -> Last Modified: 1/10/2018 21:35:44
|
6
6
|
# -> Copyright (c) 2018 Ken Spencer
|
7
7
|
# -> License: MIT
|
8
8
|
##########
|
9
|
-
require '
|
10
|
-
require 'site_hook/
|
11
|
-
require '
|
9
|
+
require 'rack'
|
10
|
+
require 'site_hook/logger'
|
11
|
+
require 'json'
|
12
|
+
require 'grape'
|
13
|
+
require 'grape-route-helpers'
|
12
14
|
|
13
15
|
module SiteHook
|
14
|
-
class
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
set raise_errors: true
|
19
|
-
set views: Pathname(SiteHook::Paths.lib_dir).join('site_hook', 'views')
|
20
|
-
set :public_folder, Pathname(SiteHook::Paths.lib_dir).join('site_hook', 'assets')
|
21
|
-
use CoffeeHandler
|
22
|
-
def self.set_options(host, port)
|
23
|
-
self.set bind: host.to_s
|
24
|
-
self.set port: port.to_i
|
25
|
-
end
|
16
|
+
class Server < Grape::API
|
17
|
+
version nil
|
18
|
+
prefix ''
|
19
|
+
format :json
|
26
20
|
|
27
21
|
#
|
28
22
|
# @param [String] body JSON String of body
|
@@ -36,142 +30,139 @@ module SiteHook
|
|
36
30
|
else
|
37
31
|
case service
|
38
32
|
when 'gogs'
|
39
|
-
if sig == OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA256.new, secret, body)
|
40
|
-
|
33
|
+
if sig == OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA256.new, secret, body.chomp)
|
34
|
+
SiteHook::Log.app.debug "Secret verified: #{sig} === #{OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA256.new, secret, body)}"
|
41
35
|
true
|
42
36
|
end
|
43
37
|
when 'github'
|
44
|
-
if sig == OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA1.new, secret, body)
|
45
|
-
|
38
|
+
if sig == OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA1.new, secret, body.chomp)
|
39
|
+
SiteHook::Log.app.debug "Secret verified: #{sig} === #{OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA1.new, secret, body)}"
|
46
40
|
true
|
47
41
|
end
|
48
42
|
else
|
49
43
|
# This shouldn't happen
|
50
44
|
end
|
51
|
-
|
52
45
|
end
|
53
46
|
end
|
54
47
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
end
|
59
|
-
|
60
|
-
APPLICATION_JSON = 'application/json'
|
61
|
-
get '/webhooks.json', provides: :json do
|
62
|
-
content_type APPLICATION_JSON
|
63
|
-
public_projects = JPHRC['projects'].select do |_project, hsh|
|
64
|
-
!hsh.fetch('private')
|
48
|
+
helpers do
|
49
|
+
def halt(status, message, headers)
|
50
|
+
error!(message, status, headers)
|
65
51
|
end
|
66
|
-
result = {}
|
67
|
-
public_projects.each do |project, hsh|
|
68
|
-
result[project] = {}
|
69
|
-
hsh.delete('hookpass')
|
70
|
-
result[project].merge!(hsh)
|
71
|
-
end
|
72
|
-
headers CONTENT_TYPE => APPLICATION_JSON, 'Accept' => APPLICATION_JSON
|
73
|
-
json result, layout: false
|
74
52
|
end
|
75
|
-
|
76
|
-
|
77
|
-
|
53
|
+
APPLICATION_JSON = 'application/json'
|
54
|
+
before do
|
55
|
+
remote_addr = request.env['REMOTE_ADDR']
|
56
|
+
cf_connecting_ip = request.env.fetch('HTTP_CF_CONNECTING_IP', nil)
|
57
|
+
ip = cf_connecting_ip || remote_addr
|
58
|
+
SiteHook::Log.access.log "#{ip} - #{request.request_method} #{request.path}"
|
78
59
|
end
|
79
|
-
|
80
|
-
|
81
|
-
if params[:splat]
|
82
|
-
pass
|
83
|
-
else
|
84
|
-
halt 405, {CONTENT_TYPE => APPLICATION_JSON}, {message: 'GET not allowed'}.to_json
|
85
|
-
end
|
60
|
+
after do
|
61
|
+
SiteHook::Log.access.log "#{status}"
|
86
62
|
end
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
{CONTENT_TYPE: APPLICATION_JSON},
|
129
|
-
'status': 'failure', 'message': 'something weird happened'
|
130
|
-
end
|
131
|
-
if event != 'push' && event.nil?
|
132
|
-
halt 400, {CONTENT_TYPE: APPLICATION_JSON}, {message: 'no event header'}.to_json
|
133
|
-
end
|
134
|
-
case service
|
135
|
-
when 'gitlab'
|
136
|
-
signature = request.env.fetch('HTTP_X_GITLAB_TOKEN', '')
|
137
|
-
plaintext = true
|
138
|
-
when 'github'
|
139
|
-
signature = request.env.fetch('HTTP_X_HUB_SIGNATURE', '').sub!(/^sha1=/, '')
|
140
|
-
plaintext = false
|
63
|
+
resource :webhook do
|
64
|
+
route_param :hook_name do
|
65
|
+
get do
|
66
|
+
STDOUT.puts params[:hook_name]
|
67
|
+
project = SiteHook::Config.projects.find_project(StrExt.mkvar(params[:hook_name]))
|
68
|
+
if project.nil?
|
69
|
+
{message: 'project not found or private', status: 1, project: {}}
|
70
|
+
else
|
71
|
+
project_obj = {}
|
72
|
+
%i[src dst repo host].each do |option|
|
73
|
+
project_obj[option] = project.instance_variable_get(StrExt.mkvar(option))
|
74
|
+
end
|
75
|
+
{project: project_obj}
|
76
|
+
end
|
77
|
+
end
|
78
|
+
post do
|
79
|
+
service = nil
|
80
|
+
request.body.rewind
|
81
|
+
req_body = request.body.read
|
82
|
+
project = SiteHook::Config.projects.get(StrExt.mkvar(params[:hook_name]))
|
83
|
+
CONTENT_TYPE = 'Content-Type'
|
84
|
+
if project == :not_found
|
85
|
+
halt 404, {message: 'no such project', status: 1}.to_json, {CONTENT_TYPE => APPLICATION_JSON}
|
86
|
+
elsif project == :no_projects
|
87
|
+
halt 500, {message: 'no projects defined', status: 2}.to_json, {CONTENT_TYPE => APPLICATION_JSON}
|
88
|
+
end
|
89
|
+
plaintext = false
|
90
|
+
signature = nil
|
91
|
+
event = nil
|
92
|
+
gogs = request.env.fetch('HTTP_X_GOGS_EVENT', nil)
|
93
|
+
unless gogs.nil?
|
94
|
+
event = 'push' if gogs == 'push'
|
95
|
+
end
|
96
|
+
github = request.env.fetch('HTTP_X_GITHUB_EVENT', nil)
|
97
|
+
unless github.nil?
|
98
|
+
event = 'push' if github == 'push'
|
99
|
+
end
|
100
|
+
gitlab = request.env.fetch('HTTP_X_GITLAB_EVENT', nil)
|
101
|
+
unless gitlab.nil?
|
102
|
+
event = 'push' if gitlab == 'push'
|
103
|
+
end
|
141
104
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
105
|
+
events = {'github' => github, 'gitlab' => gitlab, 'gogs' => gogs}
|
106
|
+
if events['github'] && events['gogs']
|
107
|
+
events['github'] = nil
|
108
|
+
end
|
109
|
+
events_m_e = events.values.one?
|
110
|
+
case events_m_e
|
111
|
+
when true
|
112
|
+
event = 'push'
|
113
|
+
service = events.select { |_key, value| value }.keys.first
|
114
|
+
when false
|
115
|
+
halt 400, {message: 'events are mutually exclusive', status: 'failure'}.to_json, {CONTENT_TYPE => APPLICATION_JSON}
|
153
116
|
|
154
|
-
|
155
|
-
status
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
117
|
+
else
|
118
|
+
halt 400, {'status': 'failure', 'message': 'something weird happened'}, {CONTENT_TYPE => APPLICATION_JSON}
|
119
|
+
end
|
120
|
+
if event != 'push' && event.nil?
|
121
|
+
halt 400, {message: 'no event header', status: 'failure'}.to_json, {CONTENT_TYPE => APPLICATION_JSON}
|
122
|
+
end
|
123
|
+
case service
|
124
|
+
when 'gitlab'
|
125
|
+
signature = request.env.fetch('HTTP_X_GITLAB_TOKEN', '')
|
126
|
+
plaintext = true
|
127
|
+
when 'github'
|
128
|
+
signature = request.env.fetch('HTTP_X_HUB_SIGNATURE', '').sub!(/^sha1=/, '')
|
129
|
+
plaintext = false
|
130
|
+
|
131
|
+
when 'gogs'
|
132
|
+
signature = request.env.fetch('HTTP_X_GOGS_SIGNATURE', '')
|
133
|
+
plaintext = false
|
160
134
|
else
|
161
135
|
# This shouldn't happen
|
162
136
|
end
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
137
|
+
if Server.verified?(req_body.to_s, signature, project.hookpass, plaintext: plaintext, service: service)
|
138
|
+
SiteHook::Log.build.info 'Building...'
|
139
|
+
begin
|
140
|
+
jekyll_status = SiteHook::Senders::Jekyll.build(project.src, project.dst, SiteHook::Log.build, options: {config: project.config})
|
141
|
+
case jekyll_status[:status]
|
142
|
+
|
143
|
+
when 0
|
144
|
+
status 200
|
145
|
+
{status: 'success'}
|
146
|
+
when -1, -2, -3
|
147
|
+
halt 400, {'status': 'exception', error: jekyll_status.fetch(:message).to_s}, {CONTENT_TYPE => APPLICATION_JSON}
|
148
|
+
else
|
149
|
+
# This shouldn't happen
|
150
|
+
end
|
151
|
+
rescue => e
|
152
|
+
halt 500, {'status': 'exception', error: e.to_s}, {CONTENT_TYPE => APPLICATION_JSON}
|
153
|
+
end
|
154
|
+
else
|
155
|
+
halt 403, {message: 'incorrect secret', 'status': 'failure'}.to_json, {CONTENT_TYPE => APPLICATION_JSON}
|
156
|
+
end
|
167
157
|
end
|
168
|
-
|
169
|
-
else
|
170
|
-
halt 403, {CONTENT_TYPE => APPLICATION_JSON}, {message: 'incorrect secret', 'status': 'failure'}.to_json
|
171
158
|
end
|
172
159
|
end
|
173
|
-
|
174
|
-
|
160
|
+
|
161
|
+
resource :webhooks do
|
162
|
+
get do
|
163
|
+
SiteHook::Config.projects.to_h
|
164
|
+
end
|
165
|
+
|
175
166
|
end
|
176
167
|
end
|
177
168
|
end
|