site_hook 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/bin/site_hook +2 -3
- data/lib/site_hook.rb +18 -10
- data/lib/site_hook/cli.rb +6 -1
- data/lib/site_hook/config_class.rb +37 -0
- data/lib/site_hook/logger.rb +11 -0
- data/lib/site_hook/sender.rb +51 -39
- data/lib/site_hook/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 77110224a51928243bd5e336829f11f626f1e9fb
|
4
|
+
data.tar.gz: 2ca551ebbcdc329502a333ce000a9154507d061a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 042c54b34afff7f71922c9d3c733f59fe4aa96fd5d0d9fa6331b7c721c41e8eddc1c67c29678513f6d52cbd1e0bdcd67b0b54735945b4bcdb92c63cd97afae56
|
7
|
+
data.tar.gz: fb99e9a7ab3851eba91a5f309e8e1ee58a0878899e51ed061564edd227b64a9ed4b82aa960091d47d975870e6374218155aca25caf96ffac9ef4745da210fb25
|
data/Gemfile.lock
CHANGED
data/bin/site_hook
CHANGED
data/lib/site_hook.rb
CHANGED
@@ -12,12 +12,17 @@ module SiteHook
|
|
12
12
|
HOOKLOG = SiteHook::HookLogger::HookLog.new(SiteHook.log_levels['hook']).log
|
13
13
|
BUILDLOG = SiteHook::HookLogger::BuildLog.new(SiteHook.log_levels['build']).log
|
14
14
|
APPLOG = SiteHook::HookLogger::AppLog.new(SiteHook.log_levels['app']).log
|
15
|
-
|
16
|
-
set port: 9090
|
15
|
+
JPHRC = YAML.load_file(Pathname(Dir.home).join('.jph-rc'))
|
16
|
+
set port: JPHRC.fetch('port', 9090)
|
17
17
|
set bind: '127.0.0.1'
|
18
18
|
set server: %w(thin)
|
19
19
|
set quiet: true
|
20
20
|
set raise_errors: true
|
21
|
+
|
22
|
+
# @param [String] body JSON String of body
|
23
|
+
# @param [String] sig Signature or token from git service
|
24
|
+
# @param [String] secret User-defined verification token
|
25
|
+
# @param [Boolean] plaintext Whether the verification is plaintext
|
21
26
|
def Webhook.verified?(body, sig, secret, plaintext:)
|
22
27
|
if plaintext
|
23
28
|
if sig === secret
|
@@ -43,8 +48,8 @@ module SiteHook
|
|
43
48
|
request.body.rewind
|
44
49
|
req_body = request.body.read
|
45
50
|
js = RecursiveOpenStruct.new(JSON.parse(req_body))
|
46
|
-
|
47
|
-
projects =
|
51
|
+
|
52
|
+
projects = JPHRC['projects']
|
48
53
|
begin
|
49
54
|
project = projects.fetch(params[:hook_name])
|
50
55
|
rescue KeyError => e
|
@@ -72,23 +77,26 @@ module SiteHook
|
|
72
77
|
end
|
73
78
|
if Webhook.verified?(req_body.to_s, signature, project['hookpass'], plaintext: plaintext)
|
74
79
|
BUILDLOG.info 'Building...'
|
75
|
-
jekyllbuild = SiteHook::Senders::Jekyll.build(project['src'], project['dst'],
|
76
|
-
|
80
|
+
jekyllbuild = SiteHook::Senders::Jekyll.build(project['src'], project['dst'], BUILDLOG)
|
81
|
+
jekyll_status = jekyllbuild.fetch(:status, 1) == 0
|
82
|
+
case jekyll_status
|
83
|
+
|
84
|
+
when 0
|
77
85
|
status 200
|
78
86
|
headers 'Content-Type' => 'application/json'
|
79
87
|
body {
|
80
88
|
{'message': 'success'}.to_json
|
81
89
|
}
|
82
|
-
|
83
|
-
status
|
90
|
+
when -1, -2, -3
|
91
|
+
status 400
|
84
92
|
headers 'Content-Type' => 'application/json'
|
85
93
|
body {
|
86
|
-
{'message': '
|
94
|
+
{'message': 'exception', error: "#{jekyll_status.fetch(:message)}"}
|
87
95
|
}
|
88
96
|
end
|
89
97
|
|
90
98
|
else
|
91
|
-
halt 403, {'Content-Type' => 'application/json'}, {message: 'incorrect secret'}.to_json
|
99
|
+
halt 403, {'Content-Type' => 'application/json'}, {message: 'incorrect secret', status: 1}.to_json
|
92
100
|
end
|
93
101
|
end
|
94
102
|
post '/webhook/?' do
|
data/lib/site_hook/cli.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'thor'
|
2
2
|
|
3
|
+
require 'site_hook/config_class'
|
3
4
|
module SiteHook
|
4
5
|
def self.log_levels
|
5
6
|
default = {
|
@@ -35,8 +36,12 @@ module SiteHook
|
|
35
36
|
desc 'start', 'Start SiteHook'
|
36
37
|
|
37
38
|
def start
|
38
|
-
|
39
|
+
|
40
|
+
SiteHook.mklogdir unless Pathname(Dir.home).join('.jph', 'logs').exist?
|
39
41
|
SiteHook::Webhook.run!
|
40
42
|
end
|
43
|
+
|
44
|
+
desc 'config SUBCOMMAND [OPTIONS]', 'Configure site_hook options'
|
45
|
+
subcommand('config', SiteHook::ConfigClass)
|
41
46
|
end
|
42
47
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'yaml'
|
3
|
+
require 'recursive-open-struct'
|
4
|
+
module SiteHook
|
5
|
+
class ConfigClass < Thor
|
6
|
+
YML = open(Pathname(Dir.home).join('.jph-rc'), 'r')
|
7
|
+
|
8
|
+
desc 'list QUERY [options]', 'List configured options'
|
9
|
+
|
10
|
+
def list
|
11
|
+
puts YML.read
|
12
|
+
end
|
13
|
+
method_option '-f', type: :boolean, banner: 'FILE', default: false
|
14
|
+
desc 'gen [options]', "Generate a example config file if one doesn't exist"
|
15
|
+
def gen
|
16
|
+
#return if Pathname(Dir.home).join('.jph-rc').exist?
|
17
|
+
|
18
|
+
yaml = [
|
19
|
+
"# fatal, error, warn, info, debug",
|
20
|
+
"log_levels:",
|
21
|
+
" hook: info",
|
22
|
+
" build: info",
|
23
|
+
" git: info",
|
24
|
+
" app: info",
|
25
|
+
"projects:",
|
26
|
+
" PROJECT.NAME: # Use the name you put as your webhook url",
|
27
|
+
" # https://jekyllhook.example.com/webhook/PROJECT.NAME",
|
28
|
+
" src: /path/to/jekyll/site/source # Directory you 'git pull' into",
|
29
|
+
" dst: /path/to/build/destination/ # The web root will be this folder",
|
30
|
+
" hookpass: SOMERANDOMSTRING # set your Gitlab-Token or GitHub secret to this",
|
31
|
+
"",
|
32
|
+
]
|
33
|
+
|
34
|
+
puts yaml
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/site_hook/logger.rb
CHANGED
@@ -62,6 +62,8 @@ module SiteHook
|
|
62
62
|
LL.debug "#{SiteHook.safe_log_name(LL.class)} initialized."
|
63
63
|
|
64
64
|
class HookLogger
|
65
|
+
|
66
|
+
# Log App Actions
|
65
67
|
class AppLog
|
66
68
|
attr :log
|
67
69
|
attr :log_level
|
@@ -80,6 +82,8 @@ module SiteHook
|
|
80
82
|
LL.debug "Initialized #{SiteHook.safe_log_name(self)}"
|
81
83
|
end
|
82
84
|
end
|
85
|
+
|
86
|
+
# Log Hook Actions
|
83
87
|
class HookLog
|
84
88
|
attr :log
|
85
89
|
attr :log_level
|
@@ -98,6 +102,7 @@ module SiteHook
|
|
98
102
|
end
|
99
103
|
end
|
100
104
|
|
105
|
+
# Log Build Actions
|
101
106
|
class BuildLog
|
102
107
|
attr :log
|
103
108
|
|
@@ -117,6 +122,7 @@ module SiteHook
|
|
117
122
|
end
|
118
123
|
end
|
119
124
|
|
125
|
+
# Log Git Actions
|
120
126
|
class GitLog
|
121
127
|
attr :log
|
122
128
|
|
@@ -134,12 +140,15 @@ module SiteHook
|
|
134
140
|
LL.debug "Initialized #{SiteHook.safe_log_name(self)}"
|
135
141
|
end
|
136
142
|
end
|
143
|
+
|
144
|
+
# Fake Logger for GitLog to preprocess output
|
137
145
|
class FakeLog < StringIO
|
138
146
|
attr :info_output, :debug_output
|
139
147
|
def initialize
|
140
148
|
@info_output = []
|
141
149
|
@debug_output = []
|
142
150
|
end
|
151
|
+
# @param [Any] message message to log
|
143
152
|
def info(message)
|
144
153
|
case
|
145
154
|
when message =~ /git .* pull/
|
@@ -149,6 +158,7 @@ module SiteHook
|
|
149
158
|
@debug_output << message
|
150
159
|
end
|
151
160
|
end
|
161
|
+
# @param [Any] message message to log
|
152
162
|
def debug(message)
|
153
163
|
case
|
154
164
|
when message =~ /\n/
|
@@ -167,6 +177,7 @@ module SiteHook
|
|
167
177
|
end
|
168
178
|
end
|
169
179
|
|
180
|
+
# @return [Hash] Hash of log entries
|
170
181
|
def entries
|
171
182
|
{
|
172
183
|
info: @info_output,
|
data/lib/site_hook/sender.rb
CHANGED
@@ -11,7 +11,6 @@ module SiteHook
|
|
11
11
|
|
12
12
|
def do_grab_version
|
13
13
|
jekyll_source = Jekyll.instance_variable_get('@jekyll_source')
|
14
|
-
build_dest = Jekyll.instance_variable_get('@build_dest')
|
15
14
|
log = Jekyll.instance_variable_get('@log')
|
16
15
|
begin
|
17
16
|
stdout_str, status = Open3.capture2({'BUNDLE_GEMFILE' => Pathname(jekyll_source).join('Gemfile').to_path}, "jekyll --version --source #{jekyll_source}")
|
@@ -23,8 +22,8 @@ module SiteHook
|
|
23
22
|
end
|
24
23
|
|
25
24
|
def do_pull
|
26
|
-
fakelog
|
27
|
-
reallog
|
25
|
+
fakelog = SiteHook::HookLogger::FakeLog.new
|
26
|
+
reallog = SiteHook::HookLogger::GitLog.new(SiteHook.log_levels['git']).log
|
28
27
|
jekyll_source = Jekyll.instance_variable_get('@jekyll_source')
|
29
28
|
build_dest = Jekyll.instance_variable_get('@build_dest')
|
30
29
|
g = Git.open(jekyll_source, :log => fakelog)
|
@@ -37,53 +36,66 @@ module SiteHook
|
|
37
36
|
def do_build
|
38
37
|
jekyll_source = Jekyll.instance_variable_get('@jekyll_source')
|
39
38
|
build_dest = Jekyll.instance_variable_get('@build_dest')
|
40
|
-
log
|
41
|
-
|
42
|
-
|
43
|
-
pid = thr.pid
|
39
|
+
log = Jekyll.instance_variable_get('@log')
|
40
|
+
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}") { |in_io, outerr_io, thr|
|
41
|
+
pid = thr.pid
|
44
42
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
end
|
43
|
+
outerr = outerr_io.read.lines
|
44
|
+
outerr.each do |line|
|
45
|
+
line = Paint.unpaint(line)
|
46
|
+
line.squish!
|
47
|
+
# Configuration file: /home/ken/sites/iotaspencer.me/_config.yml
|
48
|
+
# Source: /home/ken/sites/iotaspencer.me
|
49
|
+
# Destination: /var/www/iotaspencer.me
|
50
|
+
# Incremental build: disabled. Enable with --incremental
|
51
|
+
# Generating...
|
52
|
+
# GitHub Metadata: No GitHub API authentication could be found. Some fields may be missing or have incorrect data.
|
53
|
+
# done in 6.847 seconds.
|
54
|
+
# Auto-regeneration: disabled. Use --watch to enable.
|
55
|
+
case
|
56
|
+
when line =~ /done in .*/
|
57
|
+
log.info(line)
|
58
|
+
when line =~ /Generating/
|
59
|
+
log.info(line)
|
60
|
+
when line =~ /Configuration file:|Source:|Destination:/
|
61
|
+
log.debug(line)
|
62
|
+
when line =~ /Incremental|Auto-regeneration/
|
63
|
+
print ''
|
64
|
+
else
|
65
|
+
log.debug line
|
69
66
|
end
|
70
|
-
|
71
|
-
|
72
|
-
|
67
|
+
end
|
68
|
+
exit_status = thr.value
|
69
|
+
}
|
70
|
+
|
73
71
|
end
|
74
72
|
end
|
75
73
|
|
76
|
-
|
74
|
+
# @param [String,Pathname] jekyll_source Jekyll Source
|
75
|
+
# @param [String,Pathname] build_dest Build Destination
|
76
|
+
# @param [BuildLog] logger Build Logger Instance
|
77
|
+
def self.build(jekyll_source, build_dest, logger)
|
77
78
|
@jekyll_source = jekyll_source
|
78
79
|
@build_dest = build_dest
|
79
80
|
@log = logger
|
80
81
|
instance = self::Build.new
|
81
82
|
meths = instance.methods.select { |x| x =~ /^do_/ }
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
83
|
+
begin
|
84
|
+
meths.each do |m|
|
85
|
+
@log.debug("Running #{m}")
|
86
|
+
instance.method(m).call
|
87
|
+
@log.debug("Ran #{m}")
|
88
|
+
end
|
89
|
+
return {message: 'success', status: 0}
|
90
|
+
rescue TypeError => e
|
91
|
+
return {message: "#{e}", status: -1}
|
92
|
+
rescue KeyError => e
|
93
|
+
return {message: "#{e}", status: -2}
|
94
|
+
rescue ArgumentError => e
|
95
|
+
return {message: "#{e}", status: -3}
|
96
|
+
|
86
97
|
end
|
98
|
+
|
87
99
|
end
|
88
100
|
end
|
89
101
|
end
|
data/lib/site_hook/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: site_hook
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ken Spencer
|
@@ -214,6 +214,7 @@ files:
|
|
214
214
|
- bin/site_hook
|
215
215
|
- lib/site_hook.rb
|
216
216
|
- lib/site_hook/cli.rb
|
217
|
+
- lib/site_hook/config_class.rb
|
217
218
|
- lib/site_hook/logger.rb
|
218
219
|
- lib/site_hook/sender.rb
|
219
220
|
- lib/site_hook/spinner.rb
|