local_pac 0.3.0 → 0.4.0
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.
- 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
|