local_pac 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +15 -3
- data/app/controllers/application_controller.rb +40 -17
- data/app/controllers/git_hook_controller.rb +69 -0
- data/app/locales/en.yml +17 -4
- data/bin/local_pac +64 -14
- data/config.ru +10 -1
- data/files/example-config.erb +3 -5
- data/files/git-hook.rb.erb +121 -0
- data/lib/local_pac/cli/helper.rb +0 -22
- data/lib/local_pac/config.rb +20 -3
- data/lib/local_pac/exceptions.rb +12 -9
- data/lib/local_pac/git_repository.rb +22 -3
- data/lib/local_pac/git_storage.rb +1 -1
- data/lib/local_pac/initializer.rb +24 -12
- data/lib/local_pac/local_storage.rb +4 -1
- data/lib/local_pac/main.rb +9 -47
- data/lib/local_pac/pac_file_validator.rb +3 -2
- data/lib/local_pac/ui_logger.rb +19 -0
- data/lib/local_pac/version.rb +1 -1
- data/lib/local_pac.rb +16 -5
- data/local_pac.gemspec +3 -1
- data/spec/actions/add_examples_to_local_storage_spec.rb +1 -1
- data/spec/actions/create_directory_spec.rb +2 -2
- data/spec/actions/create_file_spec.rb +2 -2
- data/spec/actions/create_repository_spec.rb +2 -2
- data/spec/actions/send_signal_spec.rb +1 -1
- data/spec/features/check_git_push_spec.rb +105 -0
- data/spec/features/lookup_proxy_spec.rb +0 -7
- data/spec/git_repository_spec.rb +64 -0
- data/spec/initializer_spec.rb +26 -15
- data/spec/local_storage_spec.rb +31 -25
- data/spec/pac_file_validator_spec.rb +17 -3
- data/spec/proxy_pac/pac_engine_spec.rb +3 -1
- data/spec/server_spec.rb +41 -40
- data/spec/support/reporting.rb +2 -0
- metadata +38 -3
- data/files/git-hook.erb +0 -26
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
local_pac (0.
|
4
|
+
local_pac (0.3.0)
|
5
5
|
activesupport
|
6
6
|
addressable
|
7
7
|
bootstrap-sass
|
@@ -16,6 +16,8 @@ PATH
|
|
16
16
|
rugged
|
17
17
|
sass
|
18
18
|
sinatra
|
19
|
+
sinatra-contrib
|
20
|
+
sinatra-param
|
19
21
|
sprockets
|
20
22
|
sprockets-helpers
|
21
23
|
sprockets-sass
|
@@ -41,6 +43,7 @@ GEM
|
|
41
43
|
ast (1.1.0)
|
42
44
|
atomic (1.1.14)
|
43
45
|
awesome_print (1.2.0)
|
46
|
+
backports (3.6.0)
|
44
47
|
blockenspiel (0.4.5)
|
45
48
|
bond (0.5.1)
|
46
49
|
bootstrap-sass (3.1.1.0)
|
@@ -184,16 +187,25 @@ GEM
|
|
184
187
|
rack (~> 1.4)
|
185
188
|
rack-protection (~> 1.4)
|
186
189
|
tilt (~> 1.3, >= 1.3.4)
|
190
|
+
sinatra-contrib (1.4.2)
|
191
|
+
backports (>= 2.0)
|
192
|
+
multi_json
|
193
|
+
rack-protection
|
194
|
+
rack-test
|
195
|
+
sinatra (~> 1.4.0)
|
196
|
+
tilt (~> 1.3)
|
197
|
+
sinatra-param (1.1.1)
|
198
|
+
sinatra (~> 1.3)
|
187
199
|
slop (3.4.7)
|
188
200
|
sparkr (0.4.1)
|
189
|
-
sprockets (2.
|
201
|
+
sprockets (2.11.0)
|
190
202
|
hike (~> 1.2)
|
191
203
|
multi_json (~> 1.0)
|
192
204
|
rack (~> 1.0)
|
193
205
|
tilt (~> 1.1, != 1.3.0)
|
194
206
|
sprockets-helpers (1.1.0)
|
195
207
|
sprockets (~> 2.0)
|
196
|
-
sprockets-sass (1.0.
|
208
|
+
sprockets-sass (1.0.3)
|
197
209
|
sprockets (~> 2.0)
|
198
210
|
tilt (~> 1.1)
|
199
211
|
sys-proctable (0.9.3)
|
@@ -1,44 +1,64 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require 'haml'
|
3
|
-
require 'i18n'
|
4
|
-
require 'i18n/backend/fallbacks'
|
5
|
-
require 'rack/contrib/locale'
|
6
|
-
require 'sprockets-helpers'
|
7
|
-
require 'sass'
|
8
|
-
require 'sinatra'
|
9
|
-
|
10
2
|
module LocalPac
|
11
3
|
module App
|
12
4
|
class ApplicationController < Sinatra::Base
|
5
|
+
|
6
|
+
@local_storage_mutex = Mutex.new
|
7
|
+
|
8
|
+
class << self
|
9
|
+
attr_reader :local_storage_mutex
|
10
|
+
end
|
11
|
+
|
13
12
|
set :root, ::File.expand_path('../../', __FILE__)
|
14
13
|
set :haml, :format => :html5
|
15
14
|
|
16
15
|
def local_storage
|
17
16
|
return @local_storage if @local_storage
|
18
17
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
ApplicationController.local_storage_mutex.synchronize do
|
19
|
+
if settings.respond_to? :local_storage
|
20
|
+
LocalPac.ui_logger.debug 'Using local storage in production mode: loaded once on startup'
|
21
|
+
@local_storage = settings.local_storage
|
22
|
+
else
|
23
|
+
LocalPac.ui_logger.debug 'Using local storage in development mode: reloaded per request'
|
24
|
+
@local_storage = LocalPac::LocalStorage.new
|
25
|
+
end
|
23
26
|
end
|
24
27
|
end
|
25
28
|
|
26
29
|
use Rack::Deflater
|
27
30
|
use Rack::Locale
|
31
|
+
use Rack::NestedParams
|
32
|
+
use Rack::PostBodyContentTypeParser
|
28
33
|
|
29
34
|
not_found do
|
30
|
-
I18n.t('errors.
|
35
|
+
@error_summary = I18n.t('errors.unknown_proxy_pac.summary')
|
36
|
+
@error_details = I18n.t('errors.unknown_proxy_pac.details', name: env['PATH_INFO'])
|
37
|
+
|
38
|
+
halt 404, haml(:error, layout: :application)
|
31
39
|
end
|
32
40
|
|
33
41
|
error do
|
34
|
-
I18n.t('errors.default
|
42
|
+
@error_summary = I18n.t('errors.default.summary')
|
43
|
+
@error_details = I18n.t('errors.default.details')
|
44
|
+
|
45
|
+
halt 500, haml(:error, layout: :application)
|
35
46
|
end
|
36
47
|
|
37
48
|
error Exceptions::GivenUrlInvalid do
|
38
|
-
@error_summary
|
49
|
+
@error_summary = I18n.t('errors.invalid_url.summary')
|
39
50
|
@error_details = I18n.t('errors.invalid_url.details', url: env['sinatra.error'].message)
|
40
51
|
|
41
|
-
haml
|
52
|
+
halt 401, haml(:error, layout: :application)
|
53
|
+
end
|
54
|
+
|
55
|
+
set :raise_sinatra_param_exceptions, true
|
56
|
+
|
57
|
+
error Sinatra::Param::InvalidParameterError do
|
58
|
+
@error_summary = I18n.t('errors.invalid_parameter.summary')
|
59
|
+
@error_details = I18n.t('errors.invalid_parameter.details', parameter: env['sinatra.error'].param)
|
60
|
+
|
61
|
+
halt 401, haml(:error, layout: :application)
|
42
62
|
end
|
43
63
|
|
44
64
|
configure :profile do
|
@@ -58,6 +78,10 @@ module LocalPac
|
|
58
78
|
|
59
79
|
configure :development do
|
60
80
|
set :raise_errors, true
|
81
|
+
|
82
|
+
before do
|
83
|
+
LocalPac.ui_logger.debug "Parameters: " + params.to_s
|
84
|
+
end
|
61
85
|
end
|
62
86
|
|
63
87
|
configure :test do
|
@@ -86,7 +110,6 @@ module LocalPac
|
|
86
110
|
I18n.t(*args)
|
87
111
|
end
|
88
112
|
end
|
89
|
-
|
90
113
|
end
|
91
114
|
end
|
92
115
|
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module LocalPac
|
3
|
+
module App
|
4
|
+
class GitHookController < ApplicationController
|
5
|
+
|
6
|
+
helpers Sinatra::Param
|
7
|
+
helpers Sinatra::JSON
|
8
|
+
|
9
|
+
not_found do
|
10
|
+
halt 404, json(
|
11
|
+
error_summary: I18n.t('errors.unknown_git_hook.summary'),
|
12
|
+
error_details: I18n.t('errors.unknown_git_hook.details', name: env['PATH_INFO']),
|
13
|
+
result: :failure,
|
14
|
+
)
|
15
|
+
end
|
16
|
+
|
17
|
+
error do
|
18
|
+
halt 500, json(
|
19
|
+
error_summary: I18n.t('errors.default.summary'),
|
20
|
+
error_details: I18n.t('errors.default.details'),
|
21
|
+
result: :failure,
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
error Exceptions::GivenUrlInvalid do
|
26
|
+
halt 401, json(
|
27
|
+
error_summary: I18n.t('errors.invalid_url.summary'),
|
28
|
+
error_details: I18n.t('errors.invalid_url.details', url: env['sinatra.error'].message),
|
29
|
+
result: :failure,
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
set :raise_sinatra_param_exceptions, true
|
34
|
+
|
35
|
+
error Sinatra::Param::InvalidParameterError do
|
36
|
+
halt 401, json(
|
37
|
+
error_summary: I18n.t('errors.invalid_parameter.summary'),
|
38
|
+
error_details: I18n.t('errors.invalid_parameter.details', parameter: env['sinatra.error'].param),
|
39
|
+
result: :failure,
|
40
|
+
)
|
41
|
+
end
|
42
|
+
|
43
|
+
error Exceptions::PacFileInvalid do
|
44
|
+
halt 403, json(
|
45
|
+
error_summary: I18n.t('errors.invalid_pac_file.summary'),
|
46
|
+
error_details: I18n.t('errors.invalid_pac_file.details', name: env['sinatra.error']),
|
47
|
+
result: :failure,
|
48
|
+
)
|
49
|
+
end
|
50
|
+
|
51
|
+
post '/pre-receive' do
|
52
|
+
param :old_commit_id, String, required: true
|
53
|
+
param :new_commit_id, String, required: true
|
54
|
+
param :reference, String, required: true
|
55
|
+
param :api_key, String, required: true
|
56
|
+
|
57
|
+
repo = GitRepository.new(LocalPac.config.local_storage)
|
58
|
+
files = repo.added_files(params[:old_commit_id], params[:new_commit_id])
|
59
|
+
validator = PacFileValidator.new
|
60
|
+
|
61
|
+
LocalPac.ui_logger.debug "Files found: " + files.to_s
|
62
|
+
|
63
|
+
fail Exceptions::PacFileInvalid if files.any? { |f| !validator.valid?(f) }
|
64
|
+
|
65
|
+
json result: :success
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
data/app/locales/en.yml
CHANGED
@@ -2,11 +2,24 @@
|
|
2
2
|
en:
|
3
3
|
errors:
|
4
4
|
invalid_proxy_pac: The requested proxy.pac-file "%{name}" is invalid.
|
5
|
-
|
5
|
+
unknown_proxy_pac:
|
6
|
+
summary: Unknown ProxyPac-file...
|
7
|
+
details: Sorry, but I cannot find proxy.pac-file "%{name}".
|
8
|
+
unknown_git_hook:
|
9
|
+
summary: Unknown git hook...
|
10
|
+
details: Sorry, but I cannot find git hook "%{name}".
|
6
11
|
invalid_url:
|
7
|
-
summary:
|
8
|
-
details:
|
9
|
-
default:
|
12
|
+
summary: Invalid URL...
|
13
|
+
details: Sorry, but your request is invalid. The URL "%{url}" is not a correct one. Allowed are URLs like "http://www.example.org" or "www.example.org".
|
14
|
+
default:
|
15
|
+
summary: Unexpected Error...
|
16
|
+
details: Sorry, but I cannot full your request. Please ask your administrator for support.
|
17
|
+
invalid_parameter:
|
18
|
+
summary: Invalid Parameter...
|
19
|
+
details: Sorry, but your request is invalid. The parameter "%{parameter}" is unknown or the format given cannot be accepted.
|
20
|
+
invalid_pac_file:
|
21
|
+
summary: Invalid PAC-file...
|
22
|
+
details: Sorry, but your push request is invalid. The pac-file "%{name}" is invalid.
|
10
23
|
models:
|
11
24
|
data:
|
12
25
|
request_type: Request Type
|
data/bin/local_pac
CHANGED
@@ -7,8 +7,8 @@ module LocalPac
|
|
7
7
|
module Cli
|
8
8
|
class Main < Thor
|
9
9
|
class_option :config_file, type: :string, desc: 'Config file'
|
10
|
-
class_option :log_level, type: :string, desc: 'Log level for ui logging'
|
11
|
-
class_option :
|
10
|
+
class_option :log_level, default: 'info', type: :string, desc: 'Log level for ui logging'
|
11
|
+
class_option :debug_mode, type: :boolean, desc: 'Run application in debug mode'
|
12
12
|
|
13
13
|
no_commands {
|
14
14
|
include LocalPac::Cli::Helper
|
@@ -16,17 +16,20 @@ module LocalPac
|
|
16
16
|
|
17
17
|
desc 'serve', 'Serve pacfiles'
|
18
18
|
option :access_log, type: :string, desc: 'File to write access log to'
|
19
|
-
option :listen, type: :string,
|
20
|
-
option :
|
19
|
+
option :listen, type: :string, desc: 'Listen for requests'
|
20
|
+
option :environment, type: :string, desc: 'Rack environment for application'
|
21
21
|
option :with, type: :string, default: 'puma', desc: 'Server used to serve proxy pac'
|
22
22
|
def serve
|
23
23
|
LocalPac.config = LocalPac::Config.new(options[:config_file]) if options[:config_file]
|
24
24
|
LocalPac.config.access_log = options[:access_log] if options[:access_log]
|
25
|
-
|
25
|
+
LocalPac.config.log_level = options[:log_level] if options[:log_level]
|
26
|
+
LocalPac.config.debug_mode = options[:debug_mode] if options[:debug_mode]
|
27
|
+
LocalPac.config.environment = options[:environment] if options[:environment]
|
28
|
+
LocalPac.config.listen = options[:listen] if options[:listen]
|
26
29
|
LocalPac.config.lock
|
27
30
|
|
28
|
-
|
29
|
-
|
31
|
+
LocalPac.ui_logger.level = LocalPac.config.log_level
|
32
|
+
LocalPac.enable_debug_mode if LocalPac.config.debug_mode
|
30
33
|
|
31
34
|
LocalPac.ui_logger.debug('Options: ' + options.to_s)
|
32
35
|
LocalPac.ui_logger.debug("Config:\n" + LocalPac.config.to_s)
|
@@ -41,36 +44,83 @@ module LocalPac
|
|
41
44
|
end
|
42
45
|
|
43
46
|
command = command_klass.new(
|
44
|
-
listen:
|
45
|
-
environment:
|
47
|
+
listen: LocalPac.config.listen,
|
48
|
+
environment: LocalPac.config.environment,
|
46
49
|
)
|
47
50
|
|
51
|
+
ENV['DEBUG'] = LocalPac.config.debug_mode.to_s if LocalPac.config.debug_mode
|
52
|
+
ENV['ACCESS_LOG'] = LocalPac.config.access_log.to_s if LocalPac.config.access_log
|
53
|
+
ENV['LOG_LEVEL'] = LocalPac.config.log_level.to_s if LocalPac.config.log_level
|
54
|
+
|
48
55
|
Server.new(command).start
|
49
56
|
end
|
50
57
|
|
51
58
|
desc 'init', 'Create files/directories to use local_pac in dir or $PWD'
|
52
59
|
option :force, type: :boolean, default: false, desc: 'Overwrite existing files?'
|
53
60
|
option :pre_seed, type: :boolean, default: false, desc: 'Add some example files to git repository'
|
61
|
+
option :config_file, type: :string, desc: 'Path to config file'
|
62
|
+
|
63
|
+
option :local_storage, type: :string, desc: 'Path to local storage'
|
64
|
+
option :pid_file, type: :string, desc: 'Path to pid file'
|
65
|
+
option :access_log, type: :string, desc: 'Path to access log'
|
66
|
+
option :sass_cache, type: :string, desc: 'Path to sass cache'
|
67
|
+
option :reload_config_signal, type: :string, desc: 'Signal to reload config'
|
68
|
+
option :reload_storage_signal, type: :string, desc: 'Signal to reload local storage'
|
69
|
+
option :api_key, type: :string, desc: 'API key for communication between git hook and web application'
|
70
|
+
option :listen, type: :string, desc: 'Listen statement for rack server'
|
71
|
+
option :environment, type: :string, desc: 'Default environment for rack server'
|
72
|
+
|
73
|
+
option :create_pid_directory, type: :boolean, desc: 'Create pid directory', default: true
|
74
|
+
option :create_log_directory, type: :boolean, desc: 'Create log directory', default: true
|
75
|
+
option :create_sass_cache, type: :boolean, desc: 'Create sass cache directory', default: true
|
76
|
+
option :create_local_storage, type: :boolean, desc: 'Create local storage directory', default: true
|
77
|
+
option :create_pre_receive_hook, type: :boolean, desc: 'Create pre receive hook', default: true
|
78
|
+
option :create_config_file, type: :boolean, desc: 'Create config_directory', default: true
|
54
79
|
def init
|
55
80
|
LocalPac.config = LocalPac::Config.new(options[:config_file]) if options[:config_file]
|
81
|
+
|
82
|
+
LocalPac.config.log_level = options[:log_level] if options[:log_level]
|
83
|
+
LocalPac.config.debug_mode = options[:debug_mode] if options[:debug_mode]
|
84
|
+
LocalPac.config.local_storage = options[:local_storage] if options[:local_storage]
|
85
|
+
LocalPac.config.pid_file = options[:pid_file] if options[:pid_file]
|
86
|
+
LocalPac.config.access_log = options[:access_log] if options[:access_log]
|
87
|
+
LocalPac.config.sass_cache = options[:sass_cache] if options[:sass_cache]
|
88
|
+
LocalPac.config.reload_config_signal = options[:reload_config_signal] if options[:reload_config_signal]
|
89
|
+
LocalPac.config.reload_storage_signal = options[:reload_storage_signal] if options[:reload_storage_signal]
|
90
|
+
LocalPac.config.log_level = options[:log_level] if options[:log_level]
|
91
|
+
LocalPac.config.api_key = options[:api_key] if options[:api_key]
|
92
|
+
LocalPac.config.listen = options[:listen] if options[:listen]
|
93
|
+
LocalPac.config.environment = options[:environment] if options[:environment]
|
94
|
+
|
56
95
|
LocalPac.config.lock
|
57
96
|
|
58
|
-
|
59
|
-
|
97
|
+
LocalPac.ui_logger.level = LocalPac.config.log_level
|
98
|
+
LocalPac.enable_debug_mode if LocalPac.config.debug_mode
|
60
99
|
|
61
100
|
LocalPac.ui_logger.debug('Options: ' + options.to_s)
|
62
101
|
LocalPac.ui_logger.debug("Config:\n" + LocalPac.config.to_s)
|
63
102
|
|
64
|
-
Initializer.new(
|
103
|
+
Initializer.new(
|
104
|
+
force: options[:force],
|
105
|
+
pre_seed: options[:pre_seed],
|
106
|
+
create_pid_directory: options[:create_pid_directory],
|
107
|
+
create_log_directory: options[:create_log_directory],
|
108
|
+
create_sass_cache: options[:create_sass_cache],
|
109
|
+
create_local_storage: options[:create_local_storage],
|
110
|
+
create_pre_receive_hook: options[:create_pre_receive_hook],
|
111
|
+
create_config_file: options[:create_config_file],
|
112
|
+
).run
|
65
113
|
end
|
66
114
|
|
67
115
|
desc 'status', 'Show status of local_pac: configuration, known proxy pacs, server running etc.'
|
68
116
|
def status
|
69
117
|
LocalPac.config = LocalPac::Config.new(options[:config_file]) if options[:config_file]
|
118
|
+
LocalPac.config.log_level = options[:log_level] if options[:log_level]
|
119
|
+
LocalPac.config.debug_mode = options[:debug_mode] if options[:debug_mode]
|
70
120
|
LocalPac.config.lock
|
71
121
|
|
72
|
-
|
73
|
-
|
122
|
+
LocalPac.ui_logger.level = LocalPac.config.log_level
|
123
|
+
LocalPac.enable_debug_mode if LocalPac.config.debug_mode
|
74
124
|
|
75
125
|
ApplicationStatus.new.show
|
76
126
|
end
|
data/config.ru
CHANGED
@@ -2,10 +2,15 @@ $LOAD_PATH <<::File.expand_path('../lib/', __FILE__)
|
|
2
2
|
|
3
3
|
require 'local_pac'
|
4
4
|
|
5
|
+
LocalPac.config.debug_mode = true if ENV['DEBUG']
|
6
|
+
LocalPac.config.log_level = ENV['LOG_LEVEL'] if ENV['LOG_LEVEL']
|
7
|
+
LocalPac.config.access_log = ENV['ACCESS_LOG'] if ENV['ACCESS_LOG']
|
8
|
+
|
9
|
+
LocalPac.ui_logger.level = LocalPac.config.log_level
|
10
|
+
|
5
11
|
require File.expand_path('../app/controllers/application_controller.rb', __FILE__)
|
6
12
|
Dir.glob(::File.expand_path('../app/controllers/*.rb', __FILE__)).each { |f| require f }
|
7
13
|
|
8
|
-
LocalPac.ui_logger.level = ::Logger::INFO
|
9
14
|
|
10
15
|
trap LocalPac.config.reload_config_signal do
|
11
16
|
begin
|
@@ -39,6 +44,10 @@ map '/v1/lookup/' do
|
|
39
44
|
run LocalPac::App::LookupController
|
40
45
|
end
|
41
46
|
|
47
|
+
map '/v1/git_hook/' do
|
48
|
+
run LocalPac::App::GitHookController
|
49
|
+
end
|
50
|
+
|
42
51
|
map LocalPac::App::AssetsController.assets_prefix do
|
43
52
|
run LocalPac::App::AssetsController.assets
|
44
53
|
end
|
data/files/example-config.erb
CHANGED
@@ -7,8 +7,6 @@
|
|
7
7
|
# * <%= p %>
|
8
8
|
<% end -%>
|
9
9
|
|
10
|
-
:
|
11
|
-
|
12
|
-
|
13
|
-
:sass_cache: <%=::File.expand_path(lookup('sass_cache')) %>
|
14
|
-
|
10
|
+
<% LocalPac::Config.options.delete_if { |o| [:expand_path, :gem_path].include? o }.each do |o| -%>
|
11
|
+
:<%= o %>: <%= lookup(o) %>
|
12
|
+
<% end -%>
|
@@ -0,0 +1,121 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'uri'
|
4
|
+
require 'json'
|
5
|
+
require 'net/http'
|
6
|
+
require 'ostruct'
|
7
|
+
|
8
|
+
class EnvironmentCleaner
|
9
|
+
attr_reader :variables
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@variables = %w{http_proxy https_proxy HTTP_PROXY HTTPS_PROXY}
|
13
|
+
end
|
14
|
+
|
15
|
+
def cleanup
|
16
|
+
variables.each { |v| ENV.delete v }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class InputParser
|
21
|
+
def parse(input)
|
22
|
+
change = OpenStruct.new
|
23
|
+
change.old_commit_id, change.new_commit_id, change.reference = input.read.chomp.split(/ /)
|
24
|
+
|
25
|
+
change
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class Server
|
30
|
+
|
31
|
+
attr_reader :uri, :api_key, :path, :http_version
|
32
|
+
|
33
|
+
def initialize(uri, api_key, path = '/v1/git_hook/pre-receive')
|
34
|
+
@uri = parse(uri)
|
35
|
+
@api_key = api_key
|
36
|
+
@path = path
|
37
|
+
@http_version = '1.1'
|
38
|
+
end
|
39
|
+
|
40
|
+
def check(change)
|
41
|
+
data = {
|
42
|
+
old_commit_id: change.old_commit_id,
|
43
|
+
new_commit_id: change.new_commit_id,
|
44
|
+
reference: change.reference,
|
45
|
+
api_key: api_key
|
46
|
+
}
|
47
|
+
|
48
|
+
begin
|
49
|
+
response = send_request(data)
|
50
|
+
rescue Errno::ECONNREFUSED
|
51
|
+
$stderr.puts 'No connection to validator server. Please make sure the server is running before pushing files again.'
|
52
|
+
exit 1
|
53
|
+
rescue Timeout::Error
|
54
|
+
$stderr.puts 'A time out occured. The validation server does not respond in time. Please make sure the server does not hang before pushing files again.'
|
55
|
+
exit 1
|
56
|
+
end
|
57
|
+
|
58
|
+
json = JSON.parse(response.body)
|
59
|
+
|
60
|
+
if json['result'] == 'success'
|
61
|
+
$stderr.puts 'New proxy.pac-files accepted'
|
62
|
+
exit 0
|
63
|
+
else
|
64
|
+
$stderr.puts json['error_details']
|
65
|
+
exit 1
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def send_request(data)
|
72
|
+
request = Net::HTTP::Post.new(path)
|
73
|
+
request.set_form_data(data)
|
74
|
+
|
75
|
+
request.exec(socket, http_version, path)
|
76
|
+
|
77
|
+
begin
|
78
|
+
response = Net::HTTPResponse.read_new(socket)
|
79
|
+
if RUBY_VERSION >= '2'
|
80
|
+
response.decode_content = request.decode_content
|
81
|
+
end
|
82
|
+
end while response.kind_of?(Net::HTTPContinue)
|
83
|
+
|
84
|
+
response.reading_body(socket, request.response_body_permitted?) { }
|
85
|
+
|
86
|
+
if RUBY_VERSION >= '2'
|
87
|
+
response.uri = request.uri
|
88
|
+
end
|
89
|
+
|
90
|
+
response
|
91
|
+
end
|
92
|
+
|
93
|
+
def socket
|
94
|
+
@socket ||= case uri.scheme
|
95
|
+
when 'unix'
|
96
|
+
unix_socket
|
97
|
+
else
|
98
|
+
tcp_socket
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def unix_socket
|
103
|
+
Net::BufferedIO.new(UNIXSocket.new(uri.path))
|
104
|
+
end
|
105
|
+
|
106
|
+
def tcp_socket
|
107
|
+
Net::BufferedIO.new(TCPSocket.new(uri.host, uri.port))
|
108
|
+
end
|
109
|
+
|
110
|
+
def parse(local_uri)
|
111
|
+
local_uri = URI.parse(local_uri)
|
112
|
+
local_uri.scheme = 'http' if local_uri.scheme == 'tcp'
|
113
|
+
local_uri.scheme = 'https' if local_uri.scheme == 'ssl'
|
114
|
+
|
115
|
+
local_uri
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
cleaner = EnvironmentCleaner.new.cleanup
|
120
|
+
server = Server.new('<%= lookup('listen') %>', '<%= lookup('api_key') %>')
|
121
|
+
server.check(InputParser.new.parse($stdin))
|
data/lib/local_pac/cli/helper.rb
CHANGED
@@ -7,28 +7,6 @@ module LocalPac
|
|
7
7
|
rescue Errno::ENOENT
|
8
8
|
'Stale PID-file'
|
9
9
|
end
|
10
|
-
|
11
|
-
def set_log_level(requested_level)
|
12
|
-
case requested_level.to_s.to_sym
|
13
|
-
when :info
|
14
|
-
LocalPac.ui_logger.level = ::Logger::INFO
|
15
|
-
when :debug
|
16
|
-
LocalPac.ui_logger.level = ::Logger::DEBUG
|
17
|
-
else
|
18
|
-
LocalPac.ui_logger.level = ::Logger::WARN
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def set_debug(request)
|
23
|
-
if request
|
24
|
-
LocalPac.ui_logger.info "Activating debug mode."
|
25
|
-
|
26
|
-
require 'pry'
|
27
|
-
require 'debugger'
|
28
|
-
end
|
29
|
-
rescue LoadError
|
30
|
-
LocalPac.ui_logger.error "You tried to enable debug-mode, but either 'pry'- or 'debugger'-gem are not installed. Please fix that before using the debug-switch again."
|
31
|
-
end
|
32
10
|
end
|
33
11
|
end
|
34
12
|
end
|
data/lib/local_pac/config.rb
CHANGED
@@ -1,27 +1,39 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module LocalPac
|
3
|
-
|
4
3
|
class Config
|
4
|
+
|
5
5
|
private
|
6
6
|
|
7
7
|
attr_reader :config
|
8
8
|
|
9
|
-
@options =
|
9
|
+
@options = Set.new
|
10
|
+
|
10
11
|
class << self
|
11
12
|
|
13
|
+
public
|
14
|
+
|
12
15
|
attr_reader :options
|
13
16
|
|
14
|
-
def
|
17
|
+
def option_reader(option, default_value)
|
15
18
|
define_method option.to_sym do
|
16
19
|
config.fetch(option.to_sym, default_value)
|
17
20
|
end
|
18
21
|
|
22
|
+
@options << option
|
23
|
+
end
|
24
|
+
|
25
|
+
def option_writer(option)
|
19
26
|
define_method "#{option}=".to_sym do |value|
|
20
27
|
config[option.to_sym] = value
|
21
28
|
end
|
22
29
|
|
23
30
|
@options << option
|
24
31
|
end
|
32
|
+
|
33
|
+
def option(option, default_value)
|
34
|
+
option_reader(option, default_value)
|
35
|
+
option_writer(option)
|
36
|
+
end
|
25
37
|
end
|
26
38
|
|
27
39
|
public
|
@@ -54,6 +66,11 @@ module LocalPac
|
|
54
66
|
option :config_file, ::File.expand_path(::File.join(ENV['HOME'], '.config', 'local_pac', 'config.yaml'))
|
55
67
|
option :reload_config_signal, :USR1
|
56
68
|
option :reload_storage_signal, :USR2
|
69
|
+
option :debug_mode, false
|
70
|
+
option :log_level, :info
|
71
|
+
option :api_key, SecureRandom.hex
|
72
|
+
option :listen, 'tcp://127.0.0.1:8000'
|
73
|
+
option :environment, 'development'
|
57
74
|
|
58
75
|
def to_s
|
59
76
|
result = []
|
data/lib/local_pac/exceptions.rb
CHANGED
@@ -1,30 +1,33 @@
|
|
1
1
|
module LocalPac
|
2
2
|
module Exceptions
|
3
3
|
# raise if there are template syntax errrors
|
4
|
-
class ErbTemplateHasSyntaxErrors <
|
4
|
+
class ErbTemplateHasSyntaxErrors < StandardError; end
|
5
5
|
|
6
6
|
# raised if Template does not exist
|
7
|
-
class ErbTemplateIsUnknown <
|
7
|
+
class ErbTemplateIsUnknown < StandardError; end
|
8
8
|
|
9
9
|
# raised if Template does not exist
|
10
|
-
class ConfigFileNotReadable <
|
10
|
+
class ConfigFileNotReadable < StandardError; end
|
11
11
|
|
12
12
|
# raised if listen statement is invalid
|
13
|
-
class ServerListenStatementInvalid <
|
13
|
+
class ServerListenStatementInvalid < StandardError; end
|
14
14
|
|
15
15
|
# raised if entered url is invalid
|
16
|
-
class URLToSearchForInvalid <
|
16
|
+
class URLToSearchForInvalid < StandardError; end
|
17
17
|
|
18
18
|
# raised if pac file is invalid
|
19
|
-
class PacFileInvalid <
|
19
|
+
class PacFileInvalid < StandardError; end
|
20
20
|
|
21
21
|
# raised if request is invalid
|
22
|
-
class GivenUrlInvalid <
|
22
|
+
class GivenUrlInvalid < StandardError; end
|
23
23
|
|
24
24
|
# raised if pid file does not exist
|
25
|
-
class PidFileDoesNotExist <
|
25
|
+
class PidFileDoesNotExist < StandardError; end
|
26
26
|
|
27
27
|
# raised if repository does not exist
|
28
|
-
class RepositoryDoesNotExist <
|
28
|
+
class RepositoryDoesNotExist < StandardError; end
|
29
|
+
|
30
|
+
# raised if commit does not exist
|
31
|
+
class CommitDoesNotExist < StandardError; end
|
29
32
|
end
|
30
33
|
end
|