site_hook 0.8.0 → 0.8.1
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 +3 -1
- data/Gemfile +3 -1
- data/Rakefile +2 -2
- data/bin/site_hook +1 -2
- data/lib/site_hook.rb +0 -13
- data/lib/site_hook/{static/sass/styles.scss → assets/css/styles.css} +8 -8
- data/lib/site_hook/cli.rb +42 -26
- data/lib/site_hook/commands/config_class.rb +81 -0
- data/lib/site_hook/{debug_class.rb → commands/debug_class.rb} +7 -6
- data/lib/site_hook/commands/server_class.rb +39 -0
- data/lib/site_hook/config.rb +24 -0
- data/lib/site_hook/config_sections.rb +13 -0
- data/lib/site_hook/config_sections/cli.rb +24 -0
- data/lib/site_hook/config_sections/log_levels.rb +15 -0
- data/lib/site_hook/config_sections/projects.rb +22 -0
- data/lib/site_hook/const.rb +10 -0
- data/lib/site_hook/deprecate.rb +32 -0
- data/lib/site_hook/exceptions.rb +9 -0
- data/lib/site_hook/logger.rb +12 -8
- data/lib/site_hook/paths.rb +5 -2
- data/lib/site_hook/persist.rb +14 -0
- data/lib/site_hook/prompts/gen_config.rb +48 -0
- data/lib/site_hook/sender.rb +14 -8
- data/lib/site_hook/version.rb +1 -1
- data/lib/site_hook/webhook.rb +43 -48
- data/site_hook.gemspec +6 -4
- data/sonar-project.properties +4 -0
- metadata +26 -15
- data/lib/site_hook/config_class.rb +0 -92
- data/lib/site_hook/server_class.rb +0 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a6a341dfc4c29d1ba33d5674d7b21fa24745a87d604aae643ffc941ed240d8f9
|
4
|
+
data.tar.gz: be30f028fd77aae806735990684028730a4a7f22662c1ecdb43cb56e7b4dc4c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bef8e3ca33ea496f5ee60fad7a5c050a8d05acce7fbdfad5a79d855652825c2d8797c0aa342c5c925892abe52e4417a820a78da1ce2817daf172f9b91ae4e46b
|
7
|
+
data.tar.gz: fb3a74d336c1c6e7c5297b2ef6c6ef1edcf475c9f15e1f7e2c17b4704a4af24d55fab584e5e42b5f8d08d06fc44bd0233b1e34c46dfd5c0c57e70d8a4cf49a4d
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/Rakefile
CHANGED
data/bin/site_hook
CHANGED
data/lib/site_hook.rb
CHANGED
@@ -10,7 +10,6 @@ require 'recursive-open-struct'
|
|
10
10
|
require 'site_hook/cli'
|
11
11
|
require 'sinatra'
|
12
12
|
require 'haml'
|
13
|
-
require 'sass'
|
14
13
|
require 'json'
|
15
14
|
require 'sinatra/json'
|
16
15
|
require 'yaml'
|
@@ -19,18 +18,6 @@ module SiteHook
|
|
19
18
|
autoload :Logs, 'site_hook/log'
|
20
19
|
autoload :Gem, 'site_hook/gem'
|
21
20
|
autoload :Paths, 'site_hook/paths'
|
22
|
-
# class SassHandler (inherits from Sinatra::Base)
|
23
|
-
module_function
|
24
|
-
def self.set_options(name, value)
|
25
|
-
SiteHook.const_set("#{name.upcase}", value)
|
26
|
-
end
|
27
|
-
class SassHandler < Sinatra::Base
|
28
|
-
set :views, Pathname(app_file).dirname.join('site_hook', 'static', 'sass').to_s
|
29
|
-
get '/css/*.css' do
|
30
|
-
filename = params[:splat].first
|
31
|
-
scss filename.to_sym, cache: false
|
32
|
-
end
|
33
|
-
end
|
34
21
|
# class CoffeeHandler (inherits from Sinatra::Base)
|
35
22
|
class CoffeeHandler < Sinatra::Base
|
36
23
|
set :views, Pathname(app_file).dirname.join('site_hook', 'static', 'coffee').to_s
|
@@ -10,17 +10,17 @@ h1 {
|
|
10
10
|
.list-group-item {
|
11
11
|
background-color: rgb(0, 51, 2);
|
12
12
|
border-radius: 5px;
|
13
|
-
|
13
|
+
}
|
14
|
+
.list-group-item:hover {
|
14
15
|
background-color: #3a3a3a;
|
15
|
-
}
|
16
16
|
}
|
17
17
|
a {
|
18
18
|
color: darkgreen !important;
|
19
19
|
text-decoration-color: darkgreen !important;
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
20
|
+
}
|
21
|
+
a:hover {
|
22
|
+
color: green !important;
|
23
|
+
}
|
24
|
+
a:focus {
|
25
|
+
color: green !important;
|
26
26
|
}
|
data/lib/site_hook/cli.rb
CHANGED
@@ -1,32 +1,48 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
3
|
-
require '
|
4
|
-
|
1
|
+
require 'gli'
|
2
|
+
require 'highline'
|
3
|
+
require 'paint'
|
4
|
+
require 'pathname'
|
5
|
+
require 'site_hook/exceptions'
|
6
|
+
require 'site_hook/deprecate'
|
5
7
|
module SiteHook
|
6
|
-
class
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
#
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
class App
|
9
|
+
extend GLI::App
|
10
|
+
version SiteHook::VERSION
|
11
|
+
# don't use config_file just use ~/.shrc/config's cli:...
|
12
|
+
# projects are in .shrc/config
|
13
|
+
commands_from 'site_hook/commands'
|
14
|
+
desc 'Print info on the gem.'
|
15
|
+
command 'gem-info' do |c|
|
16
|
+
c.action do |global_options, options, arguments|
|
17
|
+
@hl.say "Gem Name: #{SiteHook::Gem::Info.name}"
|
18
|
+
@hl.say "Gem Constant: #{SiteHook::Gem::Info.constant_name}"
|
19
|
+
@hl.say "Gem Author: #{SiteHook::Gem::Info.author}"
|
20
|
+
@hl.say "Gem Version: v#{SiteHook::VERSION}"
|
21
|
+
end
|
14
22
|
end
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
say "Gem Name: #{SiteHook::Gem::Info.name}"
|
20
|
-
say "Gem Constant: #{SiteHook::Gem::Info.constant_name}"
|
21
|
-
say "Gem Author: #{SiteHook::Gem::Info.author}"
|
22
|
-
say "Gem Version: v#{SiteHook::VERSION}"
|
23
|
+
around do |global_options, command, options, args, code|
|
24
|
+
@config_hash = YAML.load_file(SiteHook::Paths.config) || YAML.load_file(SiteHook::Paths.old_config)
|
25
|
+
@hl = HighLine.new(STDIN, STDOUT, 80, 1, 2, 0)
|
26
|
+
code.call
|
23
27
|
end
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
28
|
+
pre do |global_options, command, options, args|
|
29
|
+
if SiteHook::Paths.old_config.exist?
|
30
|
+
continue = SiteHook::Deprecation.deprecate(
|
31
|
+
"#{SiteHook::Paths.old_config.to_s} is deprecated in favor of #{SiteHook::Paths.config}",
|
32
|
+
<<~INSTRUCT,
|
33
|
+
Please run `#{exe_name} config upgrade-shrc` to rectify this.
|
34
|
+
Once version 1.0.0 is released, #{SiteHook::Paths.config} will
|
35
|
+
be the only config file option, and #{SiteHook::Paths.old_config} will not be allowed.
|
36
|
+
any existance of ~/.jph after the 1.0.0 release will result in an Exception being raised.
|
37
|
+
Once the exception is raised, site_hook will exit and return a 99 status code.
|
38
|
+
INSTRUCT
|
39
|
+
true
|
30
40
|
|
41
|
+
)
|
42
|
+
continue
|
43
|
+
else
|
44
|
+
# don't do anything
|
45
|
+
end
|
46
|
+
end
|
31
47
|
end
|
32
48
|
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'gli'
|
2
|
+
require 'highline'
|
3
|
+
require 'random_password'
|
4
|
+
require 'yaml'
|
5
|
+
require 'site_hook/config'
|
6
|
+
module SiteHook
|
7
|
+
|
8
|
+
|
9
|
+
# *ConfigClass*
|
10
|
+
#
|
11
|
+
# Holds all of the commands for the config subcommand
|
12
|
+
class App
|
13
|
+
extend GLI::App
|
14
|
+
|
15
|
+
desc 'Configure site_hook options'
|
16
|
+
|
17
|
+
# rubocop:disable Metrics/AbcSize
|
18
|
+
command 'config' do |c|
|
19
|
+
c.command 'gen' do |gen|
|
20
|
+
gen.desc "Generate a example config file if one doesn't exist"
|
21
|
+
gen.action do |global_options, options, arguments|
|
22
|
+
|
23
|
+
yaml = [
|
24
|
+
'# fatal, error, warn, info, debug',
|
25
|
+
'log_levels:',
|
26
|
+
' hook: info',
|
27
|
+
' build: info',
|
28
|
+
' git: info',
|
29
|
+
' app: info',
|
30
|
+
|
31
|
+
]
|
32
|
+
shrc = SiteHook::Paths.config
|
33
|
+
if shrc.exist?
|
34
|
+
puts "#{shrc} exists. Will not overwrite."
|
35
|
+
else
|
36
|
+
File.open(shrc, 'w') do |f|
|
37
|
+
yaml.each do |line|
|
38
|
+
f.puts line
|
39
|
+
end
|
40
|
+
end
|
41
|
+
say "Created #{shrc}"
|
42
|
+
say "You can now edit #{shrc} and add your projects."
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
desc 'generates a project block'
|
47
|
+
c.command 'gen-project' do |gen_project|
|
48
|
+
gen_project.action do |global_options, options, arguments|
|
49
|
+
SiteHook::NotImplemented.declare(gen_project)
|
50
|
+
# puts tpl
|
51
|
+
end
|
52
|
+
end
|
53
|
+
c.command 'add-project' do |add_project|
|
54
|
+
add_project.action do |global_options, options, arguments|
|
55
|
+
# @config_hash = SiteHook::Config::Set.new(SiteHook::Paths.config)
|
56
|
+
SiteHook::NotImplemented.declare(add_project)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
c.command 'mkpass' do |mkpass|
|
61
|
+
mkpass.flag('symbol-amt', arg_name: 'AMT', type: Integer, default_value: 0)
|
62
|
+
mkpass.flag('length', arg_name: 'LENGTH', type: Integer, default_value: 10)
|
63
|
+
mkpass.action do |global_options, options, arguments|
|
64
|
+
|
65
|
+
if (8..255).include?(options[:length])
|
66
|
+
if (0..128).member?(options[:'symbol-amt'])
|
67
|
+
puts RandomPassword.generate(length: options[:length], symbols: options['symbol-amt'])
|
68
|
+
else
|
69
|
+
help_now! "Symbols amount must be between '0' and '128'."
|
70
|
+
end
|
71
|
+
else
|
72
|
+
help_now! "Length must be a positive 'Integer' between '8' and '255'"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
# rubocop:enable Metrics/AbcSize
|
@@ -6,23 +6,24 @@
|
|
6
6
|
# -> Copyright (c) 2018 Ken Spencer
|
7
7
|
# -> License: MIT
|
8
8
|
##########
|
9
|
-
require '
|
9
|
+
require 'gli'
|
10
10
|
|
11
11
|
module SiteHook
|
12
|
-
class FileExistsError <
|
12
|
+
class FileExistsError < StandardError
|
13
13
|
end
|
14
14
|
|
15
15
|
# *DebugClass*
|
16
16
|
#
|
17
|
-
# Holds all of the commands for the
|
18
|
-
class
|
17
|
+
# Holds all of the commands for the debug subcommand
|
18
|
+
class App
|
19
|
+
extend GLI::App
|
19
20
|
|
20
|
-
desc
|
21
|
+
desc "Return current paths for running site_hook"
|
21
22
|
def paths
|
22
23
|
home_gem_path = ENV['GEM_HOME']
|
23
24
|
puts home_gem_path
|
24
25
|
puts Pathname(::Gem.default_path.first).join('lib', 'site_hook')
|
25
|
-
puts .exist?
|
26
|
+
# puts .exist?
|
26
27
|
end
|
27
28
|
end
|
28
29
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
##########
|
2
|
+
# -> File: /home/ken/RubymineProjects/site_hook/lib/site_hook/config_class.1.rb
|
3
|
+
# -> Project: site_hook
|
4
|
+
# -> Author: Ken Spencer <me@iotaspencer.me>
|
5
|
+
# -> Last Modified: 1/10/2018 21:45:36
|
6
|
+
# -> Copyright (c) 2018 Ken Spencer
|
7
|
+
# -> License: MIT
|
8
|
+
##########
|
9
|
+
require 'site_hook/persist'
|
10
|
+
require 'site_hook/paths'
|
11
|
+
require 'site_hook/const'
|
12
|
+
require 'gli'
|
13
|
+
module SiteHook
|
14
|
+
autoload :Webhook, 'site_hook/webhook'
|
15
|
+
SHRC = YAML.load_file(SiteHook::Paths.config) || YAML.load_file(SiteHook::Paths.old_config)
|
16
|
+
# *ServerClass*
|
17
|
+
#
|
18
|
+
# Holds all of the commands for the config subcommand
|
19
|
+
class App
|
20
|
+
extend GLI::App
|
21
|
+
|
22
|
+
command 'server' do |c|
|
23
|
+
c.desc 'Start the server'
|
24
|
+
c.command 'listen' do |listen|
|
25
|
+
listen.desc 'Start SiteHook'
|
26
|
+
listen.flag :log_levels, type: :hash, arg_name: 'LEVELS', default: SiteHook::Logs.log_levels
|
27
|
+
listen.flag :host, type: :string, arg_name: 'BINDHOST', default: SHRC.fetch('host', '127.0.0.1')
|
28
|
+
listen.flag :port, type: :numeric, arg_name: 'BINDPORT', default: SHRC.fetch('port', 9090)
|
29
|
+
listen.action do |global_options, options, arguments|
|
30
|
+
SiteHook::Webhook.set_options(options[:host], options[:port])
|
31
|
+
SiteHook.mklogdir unless SiteHook::Paths.logs.exist?
|
32
|
+
SiteHook::Webhook.run!
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
# rubocop:enable Metrics/AbcSize
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'site_hook/paths'
|
2
|
+
require 'recursive_open_struct'
|
3
|
+
|
4
|
+
module SiteHook
|
5
|
+
class Config
|
6
|
+
class Get
|
7
|
+
attr_reader :raw_config, :parsed_config, :config
|
8
|
+
def initialize(cfg_path = Pathname.new(SiteHook::Paths.config || SiteHook::Paths.old_config))
|
9
|
+
@filename = cfg_path
|
10
|
+
@raw_config = YAML.load_file(cfg_path)
|
11
|
+
@parsed_config = RecursiveOpenStruct.new(@raw_config, recurse_over_arrays: true, preserve_original_keys: true)
|
12
|
+
@config = @parsed_config
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
class Set
|
17
|
+
attr_reader :filename
|
18
|
+
def initialize(cfg_path)
|
19
|
+
@filename = cfg_path
|
20
|
+
@config = YAML.load_file(@filename)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
module SiteHook
|
3
|
+
module ConfigSections
|
4
|
+
autoload :Cli, 'site_hook/config_sections/cli'
|
5
|
+
autoload :LogLevels, 'site_hook/config_sections/log_levels'
|
6
|
+
autoload :Projects, 'site_hook/config_sections/projects'
|
7
|
+
module_function
|
8
|
+
def print_example_config
|
9
|
+
full_config = [Cli.example, LogLevels.example, Projects.example].flatten(1)
|
10
|
+
puts full_config
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module SiteHook
|
2
|
+
module ConfigSections
|
3
|
+
class Cli
|
4
|
+
|
5
|
+
def self.example
|
6
|
+
[
|
7
|
+
'cli:',
|
8
|
+
' config:',
|
9
|
+
' mkpass:',
|
10
|
+
' symbols: 0',
|
11
|
+
' length: 8',
|
12
|
+
' gen-project:',
|
13
|
+
' config-file: _config.yml',
|
14
|
+
' add-project:',
|
15
|
+
' gen:'
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module SiteHook
|
2
|
+
module ConfigSections
|
3
|
+
class Projects
|
4
|
+
def self.example
|
5
|
+
[
|
6
|
+
'projects:',
|
7
|
+
' PROJECT.NAME:',
|
8
|
+
" config: _config.yml",
|
9
|
+
" src: /path/2/site/source",
|
10
|
+
" dst: /path/2/destination/",
|
11
|
+
" host: git*.com",
|
12
|
+
" repo: USER/REPO",
|
13
|
+
" hookpass: SOMERANDOMSTRING",
|
14
|
+
" private: true/false"
|
15
|
+
]
|
16
|
+
end
|
17
|
+
def initialize(**answers)
|
18
|
+
@answers = answers
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'site_hook/log'
|
2
|
+
require 'site_hook/logger'
|
3
|
+
module SiteHook
|
4
|
+
class Consts
|
5
|
+
HOOKLOG = SiteHook::HookLogger::HookLog.new(SiteHook::Logs.log_levels['hook']).log
|
6
|
+
BUILDLOG = SiteHook::HookLogger::BuildLog.new(SiteHook::Logs.log_levels['build']).log
|
7
|
+
APPLOG = SiteHook::HookLogger::AppLog.new(SiteHook::Logs.log_levels['app']).log
|
8
|
+
SHRC = YAML.load_file(Pathname(Dir.home).join('.jph', 'config'))
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module SiteHook
|
2
|
+
class Deprecation
|
3
|
+
attr_reader :instructions
|
4
|
+
def initialize(message, situation, instructions)
|
5
|
+
@str = "▼▼▼ [#{Paint['DEPRECATION ERROR', :red, :bold]}] —— The following situation is deprecated! ▼▼▼"
|
6
|
+
@situation = situation
|
7
|
+
@str << "\n#{@situation}"
|
8
|
+
@instructions = instructions
|
9
|
+
@str << "\n#{@instructions}"
|
10
|
+
end
|
11
|
+
def self.deprecate(situation, instructions, continue)
|
12
|
+
puts @str if @str
|
13
|
+
return continue
|
14
|
+
end
|
15
|
+
end
|
16
|
+
class NotImplemented
|
17
|
+
attr_reader :command_object
|
18
|
+
|
19
|
+
def initialize(command)
|
20
|
+
@command_object = command
|
21
|
+
@exe_name = @command_object.parent.parent.exe_name
|
22
|
+
@output_string = "Command `#{@exe_name} #{command.name_for_help.join(' ')}"
|
23
|
+
end
|
24
|
+
def self.declare(command)
|
25
|
+
instance = self.new(command)
|
26
|
+
instance.instance_variable_set(
|
27
|
+
:'@output_string',
|
28
|
+
"#{instance.instance_variable_get(:'@output_string')}` is not implemented currently")
|
29
|
+
puts instance.instance_variable_get(:'@output_string')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/site_hook/logger.rb
CHANGED
@@ -17,10 +17,11 @@ Logging.color_scheme(
|
|
17
17
|
:logger => :cyan,
|
18
18
|
:message => :green,
|
19
19
|
)
|
20
|
-
|
20
|
+
PATTERN = '[%d] %-5l %c: %m\n'
|
21
|
+
DATE_PATTERN = '%Y-%m-%d %H:%M:%S'
|
21
22
|
layout = Logging.layouts.pattern \
|
22
|
-
:pattern =>
|
23
|
-
:date_pattern =>
|
23
|
+
:pattern => PATTERN,
|
24
|
+
:date_pattern => DATE_PATTERN,
|
24
25
|
:color_scheme => 'bright'
|
25
26
|
|
26
27
|
Logging.appenders.stdout \
|
@@ -30,6 +31,7 @@ module SiteHook
|
|
30
31
|
def mklogdir
|
31
32
|
path = Pathname(Dir.home).join('.jph', 'logs')
|
32
33
|
if path.exist?
|
34
|
+
# Path exists, don't do anything
|
33
35
|
else
|
34
36
|
FileUtils.mkpath(path.to_s)
|
35
37
|
end
|
@@ -52,7 +54,7 @@ module SiteHook
|
|
52
54
|
flayout = Logging.appenders.rolling_file \
|
53
55
|
Pathname(Dir.home).join('.jph', 'logs', "#{SiteHook.safe_log_name(self)}-#{@log_level}.log").to_s,
|
54
56
|
:age => 'daily',
|
55
|
-
:pattern =>
|
57
|
+
:pattern => PATTERN
|
56
58
|
@log.add_appenders 'stdout', flayout
|
57
59
|
@log.level = log_level
|
58
60
|
end
|
@@ -77,7 +79,7 @@ module SiteHook
|
|
77
79
|
flayout = Logging.appenders.rolling_file \
|
78
80
|
Pathname(Dir.home).join('.jph', 'logs', "#{SiteHook.safe_log_name(self)}-#{@log_level}.log").to_s,
|
79
81
|
:age => 'daily',
|
80
|
-
:pattern =>
|
82
|
+
:pattern => PATTERN
|
81
83
|
@log.add_appenders 'stdout', flayout
|
82
84
|
@log.level = log_level
|
83
85
|
LL.debug "Initialized #{SiteHook.safe_log_name(self)}"
|
@@ -96,7 +98,7 @@ module SiteHook
|
|
96
98
|
flayout = Logging.appenders.rolling_file \
|
97
99
|
Pathname(Dir.home).join('.jph', 'logs', "#{SiteHook.safe_log_name(self)}-#{@log_level}.log").to_s,
|
98
100
|
:age => 'daily',
|
99
|
-
:pattern =>
|
101
|
+
:pattern => PATTERN
|
100
102
|
@log.add_appenders 'stdout', flayout
|
101
103
|
@log.level = @log_level
|
102
104
|
LL.debug "Initialized #{SiteHook.safe_log_name(self)}"
|
@@ -115,7 +117,7 @@ module SiteHook
|
|
115
117
|
flayout = Logging.appenders.rolling_file \
|
116
118
|
Pathname(Dir.home).join('.jph', 'logs', "#{SiteHook.safe_log_name(self)}-#{@log_level}.log").to_s,
|
117
119
|
:age => 'daily',
|
118
|
-
:pattern =>
|
120
|
+
:pattern => PATTERN
|
119
121
|
@log.add_appenders 'stdout', flayout
|
120
122
|
@log.level = log_level
|
121
123
|
|
@@ -135,7 +137,7 @@ module SiteHook
|
|
135
137
|
flayout = Logging.appenders.rolling_file \
|
136
138
|
Pathname(Dir.home).join('.jph', 'logs', "#{SiteHook.safe_log_name(self)}-#{@log_level}.log").to_s,
|
137
139
|
:age => 'daily',
|
138
|
-
:pattern =>
|
140
|
+
:pattern => PATTERN
|
139
141
|
@log.add_appenders 'stdout', flayout
|
140
142
|
@log.level = log_level
|
141
143
|
LL.debug "Initialized #{SiteHook.safe_log_name(self)}"
|
@@ -171,6 +173,8 @@ module SiteHook
|
|
171
173
|
@info_output << "Pulling via #{$2}/#{$3} on #{$1}."
|
172
174
|
when msg =~ /\* branch (.*?) -> .*/
|
173
175
|
@info_output << "Using #{$1} branch"
|
176
|
+
else
|
177
|
+
@debug_output << msg
|
174
178
|
end
|
175
179
|
end
|
176
180
|
else
|
data/lib/site_hook/paths.rb
CHANGED
@@ -10,12 +10,15 @@
|
|
10
10
|
module SiteHook
|
11
11
|
# Paths: Paths to gem resources and things
|
12
12
|
class Paths
|
13
|
-
def self.
|
13
|
+
def self.old_config
|
14
14
|
Pathname(Dir.home).join('.jph', 'config')
|
15
15
|
end
|
16
|
+
def self.config
|
17
|
+
Pathname(Dir.home).join('.shrc', 'config')
|
18
|
+
end
|
16
19
|
|
17
20
|
def self.logs
|
18
|
-
Pathname(Dir.home).join('.
|
21
|
+
Pathname(Dir.home).join('.shrc', 'logs')
|
19
22
|
end
|
20
23
|
def self.lib_dir
|
21
24
|
Pathname(::Gem.user_dir).join('gems', "site_hook-#{SiteHook::VERSION}", 'lib')
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'site_hook/const'
|
2
|
+
|
3
|
+
module SiteHook
|
4
|
+
class Options
|
5
|
+
def self.set_options(global, local)
|
6
|
+
global.each do |option, value|
|
7
|
+
Options.class_variable_set(:"@@global-#{option}", value)
|
8
|
+
end
|
9
|
+
local.each do |option, value|
|
10
|
+
Options.class_variable_set(:"@@local-#{option}", value)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module SiteHook
|
2
|
+
class GenConfig
|
3
|
+
# @param [HighLine]
|
4
|
+
def initialize(hl)
|
5
|
+
@hl = hl
|
6
|
+
|
7
|
+
end
|
8
|
+
def prompt_project
|
9
|
+
@hl.say "First What's the name of the project?"
|
10
|
+
project_name = @hl.ask('> ')
|
11
|
+
|
12
|
+
@hl.say "What's the source path? e.g. /home/#{ENV['USER']}/sites/site.tld"
|
13
|
+
source_path = @hl.ask('> ')
|
14
|
+
|
15
|
+
@hl.say 'Where is the web root? e.g. /var/www/sites/site.tld'
|
16
|
+
dest_path = @hl.ask('> ')
|
17
|
+
|
18
|
+
@hl.say 'The next things are for the public webhook list.'
|
19
|
+
@hl.say "\n"
|
20
|
+
@hl.say "\n"
|
21
|
+
@hl.say "What's the hostname of the git service? e.g. github.com,"
|
22
|
+
@hl.say "gitlab.com, git.domain.tld"
|
23
|
+
git_host = @hl.ask('> ')
|
24
|
+
|
25
|
+
@hl.say "What's the repo path? e.g. UserName/SiteName, UserName/site, etc."
|
26
|
+
repo_path = @hl.ask('> ')
|
27
|
+
|
28
|
+
@hl.say 'Is this repo allowed to be shown publically?'
|
29
|
+
is_private = @hl.agree('> ', true) ? true : false
|
30
|
+
|
31
|
+
@hl.say "Generating a hook password for you. If this one isn't wanted"
|
32
|
+
@hl.say "then just change it afterwards using '#{exe_name} config mkpass'."
|
33
|
+
hook_pass = RandomPassword.new(length: 20, symbols: 0).generate
|
34
|
+
@hl.say 'Done.'
|
35
|
+
@hl.say 'Outputting...'
|
36
|
+
[
|
37
|
+
" #{project_name}:",
|
38
|
+
" src: #{source_path}",
|
39
|
+
" dst: #{dest_path}",
|
40
|
+
" hookpass: #{hook_pass}",
|
41
|
+
" host: #{git_host}",
|
42
|
+
" repo: #{repo_path}",
|
43
|
+
" private: #{is_private}"
|
44
|
+
]
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/site_hook/sender.rb
CHANGED
@@ -2,6 +2,7 @@ require 'open3'
|
|
2
2
|
require 'site_hook/logger'
|
3
3
|
require 'git'
|
4
4
|
require 'paint'
|
5
|
+
require 'site_hook/persist'
|
5
6
|
module SiteHook
|
6
7
|
autoload :Logs, 'site_hook/log'
|
7
8
|
|
@@ -10,9 +11,14 @@ module SiteHook
|
|
10
11
|
attr :jekyll_source, :build_dest
|
11
12
|
|
12
13
|
class Build
|
14
|
+
def initialize(options)
|
15
|
+
@options = options
|
16
|
+
end
|
17
|
+
|
18
|
+
JEKYLL_SOURCE_VAR = '@jekyll_source'
|
13
19
|
|
14
20
|
def do_grab_version
|
15
|
-
jekyll_source = Jekyll.instance_variable_get(
|
21
|
+
jekyll_source = Jekyll.instance_variable_get(JEKYLL_SOURCE_VAR)
|
16
22
|
log = Jekyll.instance_variable_get('@log')
|
17
23
|
begin
|
18
24
|
stdout_str, status = Open3.capture2({'BUNDLE_GEMFILE' => Pathname(jekyll_source).join('Gemfile').to_path}, "jekyll --version --source #{jekyll_source}")
|
@@ -26,7 +32,7 @@ module SiteHook
|
|
26
32
|
def do_pull
|
27
33
|
fakelog = SiteHook::HookLogger::FakeLog.new
|
28
34
|
reallog = SiteHook::HookLogger::GitLog.new(SiteHook::Logs.log_levels['git']).log
|
29
|
-
jekyll_source = Jekyll.instance_variable_get(
|
35
|
+
jekyll_source = Jekyll.instance_variable_get(JEKYLL_SOURCE_VAR)
|
30
36
|
# build_dest = Jekyll.instance_variable_get('@build_dest')
|
31
37
|
g = Git.open(jekyll_source, log: fakelog)
|
32
38
|
g.pull
|
@@ -36,7 +42,7 @@ module SiteHook
|
|
36
42
|
end
|
37
43
|
|
38
44
|
def do_build
|
39
|
-
jekyll_source = Jekyll.instance_variable_get(
|
45
|
+
jekyll_source = Jekyll.instance_variable_get(JEKYLL_SOURCE_VAR)
|
40
46
|
build_dest = Jekyll.instance_variable_get('@build_dest')
|
41
47
|
log = Jekyll.instance_variable_get('@log')
|
42
48
|
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|
|
@@ -58,17 +64,17 @@ module SiteHook
|
|
58
64
|
case
|
59
65
|
when line =~ /done in .*/
|
60
66
|
log.info(line)
|
61
|
-
when line =~ /Generating
|
67
|
+
when line =~ /Generating.../
|
62
68
|
log.info(line)
|
63
69
|
when line =~ /Configuration file:|Source:|Destination:/
|
64
70
|
log.debug(line)
|
65
|
-
when line =~ /Incremental
|
71
|
+
when line =~ /Incremental build: disabled.|Auto-regeneration/
|
66
72
|
print ''
|
67
73
|
else
|
68
74
|
log.debug line
|
69
75
|
end
|
70
76
|
end
|
71
|
-
|
77
|
+
thr.value
|
72
78
|
}
|
73
79
|
|
74
80
|
end
|
@@ -82,12 +88,12 @@ module SiteHook
|
|
82
88
|
@build_dest = build_dest
|
83
89
|
@log = logger
|
84
90
|
@options = options
|
85
|
-
instance = self::Build.new
|
91
|
+
instance = self::Build.new(options)
|
86
92
|
meths = [instance.do_grab_version, instance.do_pull, instance.do_build]
|
87
93
|
begin
|
88
94
|
meths.each do |m|
|
89
95
|
@log.debug("Running #{m}")
|
90
|
-
instance.
|
96
|
+
instance.send(m)
|
91
97
|
@log.debug("Ran #{m}")
|
92
98
|
end
|
93
99
|
return {message: 'success', status: 0}
|
data/lib/site_hook/version.rb
CHANGED
data/lib/site_hook/webhook.rb
CHANGED
@@ -6,38 +6,30 @@
|
|
6
6
|
# -> Copyright (c) 2018 Ken Spencer
|
7
7
|
# -> License: MIT
|
8
8
|
##########
|
9
|
-
|
9
|
+
require 'site_hook/persist'
|
10
|
+
require 'site_hook/const'
|
10
11
|
require 'sinatra'
|
11
12
|
|
12
13
|
module SiteHook
|
13
14
|
class Webhook < Sinatra::Base
|
14
|
-
HOOKLOG = SiteHook::HookLogger::HookLog.new(SiteHook::Logs.log_levels['hook']).log
|
15
|
-
BUILDLOG = SiteHook::HookLogger::BuildLog.new(SiteHook::Logs.log_levels['build']).log
|
16
|
-
APPLOG = SiteHook::HookLogger::AppLog.new(SiteHook::Logs.log_levels['app']).log
|
17
|
-
JPHRC = YAML.load_file(Pathname(Dir.home).join('.jph', 'config'))
|
18
|
-
def self.set_bind(host, port, config)
|
19
|
-
self.set port: port
|
20
|
-
self.set bind: host
|
21
|
-
if config == '_config.yml'
|
22
|
-
SiteHook.set_options(:BUILD_CONFIG, '_config.yml')
|
23
|
-
else
|
24
|
-
SiteHook.set_options(:BUILD_CONFIG, config)
|
25
|
-
end
|
26
15
|
|
27
|
-
end
|
28
16
|
set server: %w[thin]
|
29
17
|
set quiet: true
|
30
18
|
set raise_errors: true
|
31
19
|
set views: Pathname(SiteHook::Paths.lib_dir).join('site_hook', 'views')
|
32
|
-
set :public_folder, Pathname(SiteHook::Paths.lib_dir).join('site_hook', '
|
33
|
-
use SassHandler
|
20
|
+
set :public_folder, Pathname(SiteHook::Paths.lib_dir).join('site_hook', 'assets')
|
34
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
|
35
26
|
|
36
|
-
#
|
27
|
+
#
|
37
28
|
# @param [String] body JSON String of body
|
38
29
|
# @param [String] sig Signature or token from git service
|
39
30
|
# @param [String] secret User-defined verification token
|
40
31
|
# @param [Boolean] plaintext Whether the verification is plaintext
|
32
|
+
# @param [String] service service name
|
41
33
|
def self.verified?(body, sig, secret, plaintext:, service:)
|
42
34
|
if plaintext
|
43
35
|
sig == secret
|
@@ -53,57 +45,60 @@ module SiteHook
|
|
53
45
|
APPLOG.debug "Secret verified: #{sig} === #{OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA1.new, secret, body)}"
|
54
46
|
true
|
55
47
|
end
|
48
|
+
else
|
49
|
+
# This shouldn't happen
|
56
50
|
end
|
57
51
|
|
58
52
|
end
|
59
53
|
end
|
60
54
|
|
55
|
+
CONTENT_TYPE = 'Content-Type'
|
61
56
|
get '/' do
|
62
|
-
halt 403, {
|
57
|
+
halt 403, {CONTENT_TYPE => 'text/html'}, '<h1>See <a href="/webhooks/">here</a> for the active webhooks</h1>'
|
63
58
|
end
|
64
59
|
|
60
|
+
APPLICATION_JSON = 'application/json'
|
65
61
|
get '/webhooks.json', provides: :json do
|
66
|
-
content_type
|
62
|
+
content_type APPLICATION_JSON
|
67
63
|
public_projects = JPHRC['projects'].select do |_project, hsh|
|
68
|
-
|
64
|
+
!hsh.fetch('private')
|
69
65
|
end
|
70
|
-
result
|
66
|
+
result = {}
|
71
67
|
public_projects.each do |project, hsh|
|
72
68
|
result[project] = {}
|
73
69
|
hsh.delete('hookpass')
|
74
70
|
result[project].merge!(hsh)
|
75
71
|
end
|
76
|
-
headers
|
72
|
+
headers CONTENT_TYPE => APPLICATION_JSON, 'Accept' => APPLICATION_JSON
|
77
73
|
json result, layout: false
|
78
74
|
end
|
79
75
|
|
80
76
|
get '/webhooks/?' do
|
81
|
-
haml :webhooks, locals: {
|
77
|
+
haml :webhooks, locals: {'projects' => JPHRC['projects']}
|
82
78
|
end
|
83
79
|
|
84
80
|
get '/webhook/*' do
|
85
81
|
if params[:splat]
|
86
82
|
pass
|
87
83
|
else
|
88
|
-
halt 405, {
|
84
|
+
halt 405, {CONTENT_TYPE => APPLICATION_JSON}, {message: 'GET not allowed'}.to_json
|
89
85
|
end
|
90
86
|
end
|
91
87
|
post '/webhook/:hook_name/?' do
|
92
88
|
service = nil
|
93
89
|
request.body.rewind
|
94
90
|
req_body = request.body.read
|
95
|
-
js
|
91
|
+
js = RecursiveOpenStruct.new(JSON.parse(req_body))
|
96
92
|
|
97
93
|
projects = JPHRC['projects']
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
halt 404, { 'Content-Type' => 'application/json' }, { message: 'no such project', status: 1 }.to_json
|
94
|
+
project = projects.fetch(params[:hook_name], nil)
|
95
|
+
if project.nil?
|
96
|
+
halt 404, {CONTENT_TYPE => APPLICATION_JSON}, {message: 'no such project', status: 1}.to_json
|
102
97
|
end
|
103
98
|
plaintext = false
|
104
99
|
signature = nil
|
105
|
-
event
|
106
|
-
gogs
|
100
|
+
event = nil
|
101
|
+
gogs = request.env.fetch('HTTP_X_GOGS_EVENT', nil)
|
107
102
|
unless gogs.nil?
|
108
103
|
event = 'push' if gogs == 'push'
|
109
104
|
end
|
@@ -116,27 +111,25 @@ module SiteHook
|
|
116
111
|
event = 'push' if gitlab == 'push'
|
117
112
|
end
|
118
113
|
|
119
|
-
events = {
|
114
|
+
events = {'github' => github, 'gitlab' => gitlab, 'gogs' => gogs}
|
120
115
|
if events['github'] && events['gogs']
|
121
116
|
events['github'] = nil
|
122
117
|
end
|
123
118
|
events_m_e = events.values.one?
|
124
119
|
case events_m_e
|
125
120
|
when true
|
126
|
-
event
|
121
|
+
event = 'push'
|
127
122
|
service = events.select { |_key, value| value }.keys.first
|
128
123
|
when false
|
129
|
-
halt 400, {
|
124
|
+
halt 400, {CONTENT_TYPE: APPLICATION_JSON}, {message: 'events are mutually exclusive', status: 'failure'}.to_json
|
130
125
|
|
131
126
|
else
|
132
127
|
halt 400,
|
133
|
-
{
|
128
|
+
{CONTENT_TYPE: APPLICATION_JSON},
|
134
129
|
'status': 'failure', 'message': 'something weird happened'
|
135
130
|
end
|
136
|
-
if event != 'push'
|
137
|
-
|
138
|
-
halt 400, { 'Content-Type': 'application/json' }, { message: 'no event header' }.to_json
|
139
|
-
end
|
131
|
+
if event != 'push' && event.nil?
|
132
|
+
halt 400, {CONTENT_TYPE: APPLICATION_JSON}, {message: 'no event header'}.to_json
|
140
133
|
end
|
141
134
|
case service
|
142
135
|
when 'gitlab'
|
@@ -149,34 +142,36 @@ module SiteHook
|
|
149
142
|
when 'gogs'
|
150
143
|
signature = request.env.fetch('HTTP_X_GOGS_SIGNATURE', '')
|
151
144
|
plaintext = false
|
145
|
+
else
|
146
|
+
# This shouldn't happen
|
152
147
|
end
|
153
148
|
if Webhook.verified?(req_body.to_s, signature, project['hookpass'], plaintext: plaintext, service: service)
|
154
149
|
BUILDLOG.info 'Building...'
|
155
150
|
begin
|
156
|
-
|
157
|
-
jekyll_status = jekyllbuild
|
151
|
+
jekyll_status = SiteHook::Senders::Jekyll.build(project['src'], project['dst'], BUILDLOG, options: {config: project['config']})
|
158
152
|
case jekyll_status
|
159
153
|
|
160
154
|
when 0
|
161
155
|
status 200
|
162
|
-
headers
|
163
|
-
body { {
|
156
|
+
headers CONTENT_TYPE => APPLICATION_JSON
|
157
|
+
body { {'status': 'success'}.to_json }
|
164
158
|
when -1, -2, -3
|
165
|
-
halt 400, {
|
166
|
-
|
159
|
+
halt 400, {CONTENT_TYPE => APPLICATION_JSON}, {'status': 'exception', error: jekyll_status.fetch(:message).to_s}
|
160
|
+
else
|
161
|
+
# This shouldn't happen
|
167
162
|
end
|
168
163
|
|
169
164
|
rescue => e
|
170
|
-
halt 500, {
|
165
|
+
halt 500, {CONTENT_TYPE => APPLICATION_JSON}, {'status': 'exception', error: e.to_s}
|
171
166
|
|
172
167
|
end
|
173
168
|
|
174
169
|
else
|
175
|
-
halt 403, {
|
170
|
+
halt 403, {CONTENT_TYPE => APPLICATION_JSON}, {message: 'incorrect secret', 'status': 'failure'}.to_json
|
176
171
|
end
|
177
172
|
end
|
178
173
|
post '/webhook/?' do
|
179
|
-
halt 403, {
|
174
|
+
halt 403, {CONTENT_TYPE => APPLICATION_JSON}, {message: 'pick a hook', error: 'root webhook hit', 'status': 'failure'}.to_json
|
180
175
|
end
|
181
176
|
end
|
182
177
|
end
|
data/site_hook.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
'tutorial_uri' => 'https://iotaspencer.me/projects/site_hook/'
|
22
22
|
}
|
23
23
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
24
|
-
f.match(%r{^(
|
24
|
+
f.match(%r{^(tests)/})
|
25
25
|
end
|
26
26
|
spec.bindir = 'bin'
|
27
27
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
@@ -34,12 +34,14 @@ Gem::Specification.new do |spec|
|
|
34
34
|
spec.add_runtime_dependency 'paint', '~> 2.0'
|
35
35
|
spec.add_runtime_dependency 'random_password', '~> 0.1.1'
|
36
36
|
spec.add_runtime_dependency 'recursive-open-struct', '~> 1.1'
|
37
|
-
spec.add_runtime_dependency '
|
37
|
+
spec.add_runtime_dependency 'redis', '~> 4.1.0'
|
38
38
|
spec.add_runtime_dependency 'sinatra', '~> 2.0.2', '>= 2.0.5'
|
39
39
|
spec.add_runtime_dependency 'sinatra-contrib', '~> 2.0', '>= 2.0.5'
|
40
40
|
spec.add_runtime_dependency 'thin', '~> 1.7'
|
41
|
-
spec.add_runtime_dependency '
|
41
|
+
spec.add_runtime_dependency 'gli', '~> 2.18.0'
|
42
42
|
spec.add_development_dependency 'bundler', '~> 1.16'
|
43
43
|
spec.add_development_dependency 'rake', '~> 10.0'
|
44
|
-
spec.add_development_dependency '
|
44
|
+
spec.add_development_dependency 'minitest', '~> 5.11.3'
|
45
|
+
|
46
|
+
spec.post_install_message
|
45
47
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: site_hook
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ken Spencer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-02-
|
11
|
+
date: 2019-02-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -129,19 +129,19 @@ dependencies:
|
|
129
129
|
- !ruby/object:Gem::Version
|
130
130
|
version: '1.1'
|
131
131
|
- !ruby/object:Gem::Dependency
|
132
|
-
name:
|
132
|
+
name: redis
|
133
133
|
requirement: !ruby/object:Gem::Requirement
|
134
134
|
requirements:
|
135
135
|
- - "~>"
|
136
136
|
- !ruby/object:Gem::Version
|
137
|
-
version:
|
137
|
+
version: 4.1.0
|
138
138
|
type: :runtime
|
139
139
|
prerelease: false
|
140
140
|
version_requirements: !ruby/object:Gem::Requirement
|
141
141
|
requirements:
|
142
142
|
- - "~>"
|
143
143
|
- !ruby/object:Gem::Version
|
144
|
-
version:
|
144
|
+
version: 4.1.0
|
145
145
|
- !ruby/object:Gem::Dependency
|
146
146
|
name: sinatra
|
147
147
|
requirement: !ruby/object:Gem::Requirement
|
@@ -197,19 +197,19 @@ dependencies:
|
|
197
197
|
- !ruby/object:Gem::Version
|
198
198
|
version: '1.7'
|
199
199
|
- !ruby/object:Gem::Dependency
|
200
|
-
name:
|
200
|
+
name: gli
|
201
201
|
requirement: !ruby/object:Gem::Requirement
|
202
202
|
requirements:
|
203
203
|
- - "~>"
|
204
204
|
- !ruby/object:Gem::Version
|
205
|
-
version:
|
205
|
+
version: 2.18.0
|
206
206
|
type: :runtime
|
207
207
|
prerelease: false
|
208
208
|
version_requirements: !ruby/object:Gem::Requirement
|
209
209
|
requirements:
|
210
210
|
- - "~>"
|
211
211
|
- !ruby/object:Gem::Version
|
212
|
-
version:
|
212
|
+
version: 2.18.0
|
213
213
|
- !ruby/object:Gem::Dependency
|
214
214
|
name: bundler
|
215
215
|
requirement: !ruby/object:Gem::Requirement
|
@@ -239,19 +239,19 @@ dependencies:
|
|
239
239
|
- !ruby/object:Gem::Version
|
240
240
|
version: '10.0'
|
241
241
|
- !ruby/object:Gem::Dependency
|
242
|
-
name:
|
242
|
+
name: minitest
|
243
243
|
requirement: !ruby/object:Gem::Requirement
|
244
244
|
requirements:
|
245
245
|
- - "~>"
|
246
246
|
- !ruby/object:Gem::Version
|
247
|
-
version:
|
247
|
+
version: 5.11.3
|
248
248
|
type: :development
|
249
249
|
prerelease: false
|
250
250
|
version_requirements: !ruby/object:Gem::Requirement
|
251
251
|
requirements:
|
252
252
|
- - "~>"
|
253
253
|
- !ruby/object:Gem::Version
|
254
|
-
version:
|
254
|
+
version: 5.11.3
|
255
255
|
description:
|
256
256
|
email:
|
257
257
|
- me@iotaspencer.me
|
@@ -274,22 +274,33 @@ files:
|
|
274
274
|
- bin/console
|
275
275
|
- bin/site_hook
|
276
276
|
- lib/site_hook.rb
|
277
|
+
- lib/site_hook/assets/css/styles.css
|
277
278
|
- lib/site_hook/cli.rb
|
278
|
-
- lib/site_hook/config_class.rb
|
279
|
-
- lib/site_hook/debug_class.rb
|
279
|
+
- lib/site_hook/commands/config_class.rb
|
280
|
+
- lib/site_hook/commands/debug_class.rb
|
281
|
+
- lib/site_hook/commands/server_class.rb
|
282
|
+
- lib/site_hook/config.rb
|
283
|
+
- lib/site_hook/config_sections.rb
|
284
|
+
- lib/site_hook/config_sections/cli.rb
|
285
|
+
- lib/site_hook/config_sections/log_levels.rb
|
286
|
+
- lib/site_hook/config_sections/projects.rb
|
287
|
+
- lib/site_hook/const.rb
|
288
|
+
- lib/site_hook/deprecate.rb
|
289
|
+
- lib/site_hook/exceptions.rb
|
280
290
|
- lib/site_hook/gem.rb
|
281
291
|
- lib/site_hook/log.rb
|
282
292
|
- lib/site_hook/logger.rb
|
283
293
|
- lib/site_hook/paths.rb
|
294
|
+
- lib/site_hook/persist.rb
|
295
|
+
- lib/site_hook/prompts/gen_config.rb
|
284
296
|
- lib/site_hook/sender.rb
|
285
|
-
- lib/site_hook/server_class.rb
|
286
297
|
- lib/site_hook/spinner.rb
|
287
|
-
- lib/site_hook/static/sass/styles.scss
|
288
298
|
- lib/site_hook/version.rb
|
289
299
|
- lib/site_hook/views/layout.haml
|
290
300
|
- lib/site_hook/views/webhooks.haml
|
291
301
|
- lib/site_hook/webhook.rb
|
292
302
|
- site_hook.gemspec
|
303
|
+
- sonar-project.properties
|
293
304
|
homepage: https://iotaspencer.me/projects/site_hook/
|
294
305
|
licenses:
|
295
306
|
- MIT
|
@@ -1,92 +0,0 @@
|
|
1
|
-
require 'thor'
|
2
|
-
require 'highline'
|
3
|
-
require 'random_password'
|
4
|
-
require 'yaml'
|
5
|
-
require 'recursive-open-struct'
|
6
|
-
module SiteHook
|
7
|
-
class FileExistsError < Exception
|
8
|
-
end
|
9
|
-
|
10
|
-
# *ConfigClass*
|
11
|
-
#
|
12
|
-
# Holds all of the commands for the config subcommand
|
13
|
-
class ConfigClass < Thor
|
14
|
-
|
15
|
-
desc 'gen [options]', "Generate a example config file if one doesn't exist"
|
16
|
-
# rubocop:disable Metrics/AbcSize
|
17
|
-
def gen
|
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/2/site/source # Directory you 'git pull' into",
|
29
|
-
' dst: /path/2/destination/ # The web root will be this folder',
|
30
|
-
" host: git*.com # The git service you're using for vcs",
|
31
|
-
' repo: USER/REPO # The repo path on the git service',
|
32
|
-
' hookpass: SOMERANDOMSTRING # Gitlab-Token or GitHub secret, etc.',
|
33
|
-
' private: true/false # hidden from the public list',
|
34
|
-
''
|
35
|
-
]
|
36
|
-
jphrc = SiteHook::Paths.config
|
37
|
-
if jphrc.exist?
|
38
|
-
puts "#{jphrc} exists. Will not overwrite."
|
39
|
-
else
|
40
|
-
File.open(jphrc, 'w') do |f|
|
41
|
-
yaml.each do |line|
|
42
|
-
f.puts line
|
43
|
-
end
|
44
|
-
end
|
45
|
-
say "Created #{jphrc}"
|
46
|
-
say "You can now edit #{jphrc} and add your projects."
|
47
|
-
end
|
48
|
-
end
|
49
|
-
desc 'gen-project [options]', 'generates a project block'
|
50
|
-
def gen_project
|
51
|
-
hl = HighLine.new
|
52
|
-
hl.say "First What's the name of the project?"
|
53
|
-
project_name = hl.ask('> ')
|
54
|
-
|
55
|
-
hl.say "What's the source path? e.g. /home/#{ENV['USER']}/sites/site.tld"
|
56
|
-
source_path = hl.ask('> ')
|
57
|
-
|
58
|
-
hl.say 'Where is the web root? e.g. /var/www/sites/site.tld'
|
59
|
-
dest_path = hl.ask('> ')
|
60
|
-
|
61
|
-
hl.say 'The next things are for the public webhook list.'
|
62
|
-
hl.say "\n"
|
63
|
-
hl.say "\n"
|
64
|
-
hl.say "What's the hostname of the git service? e.g. github.com,"
|
65
|
-
hl.say "gitlab.com, git.domain.tld"
|
66
|
-
git_host = hl.ask('> ')
|
67
|
-
|
68
|
-
hl.say "What's the repo path? e.g. UserName/SiteName, UserName/site, etc."
|
69
|
-
repo_path = hl.ask('> ')
|
70
|
-
|
71
|
-
hl.say 'Is this repo allowed to be shown publically?'
|
72
|
-
is_private = hl.agree('> ', true) ? true : false
|
73
|
-
|
74
|
-
hl.say "Generating a hook password for you. If this one isn't wanted"
|
75
|
-
hl.say 'then just change it afterwards.'
|
76
|
-
hook_pass = RandomPassword.new(length: 20, symbols: 0).generate
|
77
|
-
hl.say 'Done.'
|
78
|
-
hl.say 'Outputting...'
|
79
|
-
tpl = [
|
80
|
-
" #{project_name}:",
|
81
|
-
" src: #{source_path}",
|
82
|
-
" dst: #{dest_path}",
|
83
|
-
" hookpass: #{hook_pass}",
|
84
|
-
" host: #{git_host}",
|
85
|
-
" repo: #{repo_path}",
|
86
|
-
" private: #{is_private}"
|
87
|
-
]
|
88
|
-
puts tpl
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
# rubocop:enable Metrics/AbcSize
|
@@ -1,29 +0,0 @@
|
|
1
|
-
##########
|
2
|
-
# -> File: /home/ken/RubymineProjects/site_hook/lib/site_hook/config_class.1.rb
|
3
|
-
# -> Project: site_hook
|
4
|
-
# -> Author: Ken Spencer <me@iotaspencer.me>
|
5
|
-
# -> Last Modified: 1/10/2018 21:45:36
|
6
|
-
# -> Copyright (c) 2018 Ken Spencer
|
7
|
-
# -> License: MIT
|
8
|
-
##########
|
9
|
-
require 'thor'
|
10
|
-
module SiteHook
|
11
|
-
autoload :Webhook, 'site_hook/webhook'
|
12
|
-
JPHRC = YAML.load_file(Pathname(Dir.home).join('.jph', 'config'))
|
13
|
-
# *ServerClass*
|
14
|
-
#
|
15
|
-
# Holds all of the commands for the config subcommand
|
16
|
-
class ServerClass < Thor
|
17
|
-
method_option(:log_levels, type: :hash, banner: 'LEVELS', default: SiteHook::Logs.log_levels)
|
18
|
-
method_option :host, type: :string, banner: 'BINDHOST', default: JPHRC.fetch('host', '127.0.0.1')
|
19
|
-
method_option :port, type: :string, banner: 'BINDPORT', default: JPHRC.fetch('port', 9090)
|
20
|
-
method_option :config, type: :string, banner: 'CONFIGFILE', default: '_config.yml'
|
21
|
-
desc 'listen', 'Start SiteHook'
|
22
|
-
def listen
|
23
|
-
SiteHook.mklogdir unless SiteHook::Paths.logs.exist?
|
24
|
-
SiteHook::Webhook.set_options(options[:host], options[:port], options[:config])
|
25
|
-
SiteHook::Webhook.run!
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
# rubocop:enable Metrics/AbcSize
|