local_pac 0.2.0 → 0.2.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.
- data/README.md +70 -8
- data/app/assets/javascripts/application.js +1 -1
- data/bin/local_pac +2 -1
- data/features/{fetch_proxy_pac.feature → fetch_proxy_pac.feature_} +0 -0
- data/features/{initializer.feature → initializer.feature_} +0 -0
- data/features/{show_status.feature → show_status.feature_} +0 -0
- data/files/examples/proxy-complex.pac.example +42 -0
- data/files/examples/proxy-function_demo.pac.example +51 -0
- data/files/examples/proxy.pac.example +3 -0
- data/lib/local_pac/actions/add_examples_to_local_storage.rb +45 -0
- data/lib/local_pac/file.rb +1 -1
- data/lib/local_pac/git_repository.rb +38 -2
- data/lib/local_pac/initializer.rb +7 -2
- data/lib/local_pac/version.rb +1 -1
- data/lib/local_pac.rb +1 -1
- data/share/archlinux/PKGBUILD +5 -8
- data/spec/actions/add_examples_to_local_storage_spec.rb +44 -0
- data/spec/features/fetch_proxy_pac_spec.rb +6 -9
- data/spec/features/lookup_proxy_spec.rb +6 -9
- data/spec/git_repository_spec.rb +64 -0
- data/spec/initializer_spec.rb +25 -1
- metadata +16 -13
- data/lib/local_pac/git.rb +0 -77
- data/spec/git_spec.rb +0 -106
- data/spec/support/git.rb +0 -73
data/README.md
CHANGED
@@ -5,19 +5,46 @@
|
|
5
5
|
[](https://coveralls.io/r/dg-vrnetze/local_pac?branch=master)
|
6
6
|
[](http://badge.fury.io/rb/local_pac)
|
7
7
|
|
8
|
-
`local_pac` serves
|
8
|
+
`local_pac` *serves two main purposes:*
|
9
9
|
|
10
|
-
1. Serve proxy.pac-files compressed from a
|
10
|
+
1. Serve proxy.pac-files compressed from a git repository.
|
11
11
|
2. Lookup of url in proxy.pac to find out which proxy will be used.
|
12
12
|
|
13
|
-
Behind the scenes it uses
|
14
|
-
([uglifier](https://github.com/lautis/uglifier)) to make 1. and and a proxy-pac
|
15
|
-
parser ([ruby-pac](https://github.com/samuelkadolph/ruby-pac)) to make 2.
|
16
|
-
possible.
|
13
|
+
*Behind the scenes it uses ...*
|
17
14
|
|
15
|
+
* a javascript compressor ([uglifier](https://github.com/lautis/uglifier))
|
16
|
+
* a proxy-pac parser ([ruby-pac](https://github.com/samuelkadolph/ruby-pac))
|
17
|
+
* a vcs library ([rugged](https://github.com/libgit2/rugged))
|
18
|
+
* etc.
|
19
|
+
|
20
|
+
*Possible use cases:*
|
21
|
+
|
22
|
+
* Administrator serving proxy.pacs to thousands of clients
|
23
|
+
* Internal developer using virtual machines on her laptop to develop web
|
24
|
+
applications but who still needs access to external web applications via
|
25
|
+
internal proxy
|
26
|
+
* Developer/Consultant using a vpn connection to her customer + internal
|
27
|
+
proxy/socks proxy, but still needs direct access to the internet web
|
28
|
+
applications
|
29
|
+
* Supporter who needs to support thousand of clients and needs to check which
|
30
|
+
internal proxies is used for a given url
|
31
|
+
* Curious people loving git and using it for every possible use case ;-)
|
32
|
+
|
33
|
+
## Screenshots
|
34
|
+
|
35
|
+
*Search for a url*
|
36
|
+

|
37
|
+
|
38
|
+
*Pretty result for a url*
|
39
|
+

|
40
|
+
|
41
|
+
*Raw result for a url*
|
42
|
+

|
18
43
|
|
19
44
|
## Installation
|
20
45
|
|
46
|
+
### RubyGems
|
47
|
+
|
21
48
|
Add this line to your application's Gemfile:
|
22
49
|
|
23
50
|
gem 'local_pac'
|
@@ -30,11 +57,46 @@ Or install it yourself as:
|
|
30
57
|
|
31
58
|
$ gem install local_pac
|
32
59
|
|
33
|
-
|
34
|
-
|
60
|
+
### Arch Linux
|
61
|
+
|
62
|
+
```bash
|
63
|
+
# Install via yaourt
|
64
|
+
yaourt -S local_pac
|
65
|
+
|
66
|
+
# Install via cower + makepkg
|
67
|
+
cower -d local_pac
|
68
|
+
cd <dir>
|
69
|
+
makepkg -is
|
70
|
+
```
|
35
71
|
|
36
72
|
## Usage
|
37
73
|
|
74
|
+
### Quickstart
|
75
|
+
|
76
|
+
*Initialize local_pac*
|
77
|
+
|
78
|
+
```
|
79
|
+
% local_pac init --pre-seed
|
80
|
+
```
|
81
|
+
|
82
|
+
*Starting Webserver*
|
83
|
+
|
84
|
+
```
|
85
|
+
% local_pac serve
|
86
|
+
```
|
87
|
+
|
88
|
+
*Download proxy.pac on commandline*
|
89
|
+
|
90
|
+
```
|
91
|
+
% curl --noproxy "*" http://localhost:8000/v1/pac/proxy.pac
|
92
|
+
```
|
93
|
+
|
94
|
+
*Starting webbrowser and open web application*
|
95
|
+
|
96
|
+
```
|
97
|
+
% firefox http://localhost:8000/v1/lookup/proxy.pac
|
98
|
+
```
|
99
|
+
|
38
100
|
### Getting started
|
39
101
|
|
40
102
|
Make sure that you place a config file for `local_pac` in one of the following
|
data/bin/local_pac
CHANGED
@@ -35,6 +35,7 @@ module LocalPac
|
|
35
35
|
|
36
36
|
desc 'init', 'Create files/directories to use local_pac in dir or $PWD'
|
37
37
|
option :force, type: :boolean, default: false, desc: 'Overwrite existing files?'
|
38
|
+
option :pre_seed, type: :boolean, default: false, desc: 'Add some example files to git repository'
|
38
39
|
def init
|
39
40
|
LocalPac.config = LocalPac::Config.new(options[:config_file]) if options[:config_file]
|
40
41
|
LocalPac.config.lock
|
@@ -45,7 +46,7 @@ module LocalPac
|
|
45
46
|
LocalPac.ui_logger.debug('Options: ' + options.to_s)
|
46
47
|
LocalPac.ui_logger.debug("Config:\n" + LocalPac.config.to_s)
|
47
48
|
|
48
|
-
Initializer.new(force: options[:force]).run
|
49
|
+
Initializer.new(force: options[:force], pre_seed: options[:pre_seed]).run
|
49
50
|
end
|
50
51
|
|
51
52
|
desc 'status', 'Show status of local_pac: configuration, known proxy pacs, server running etc.'
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,42 @@
|
|
1
|
+
// Main
|
2
|
+
function FindProxyForURL(url, host) {
|
3
|
+
|
4
|
+
if ( reach_via_socks(url, host, dnsResolve(host))) {
|
5
|
+
return socks_proxy();
|
6
|
+
}
|
7
|
+
|
8
|
+
if ( reach_directly(url, host, dnsResolve(host))) {
|
9
|
+
return no_proxy();
|
10
|
+
}
|
11
|
+
|
12
|
+
return default_proxy();
|
13
|
+
}
|
14
|
+
|
15
|
+
|
16
|
+
// Helper
|
17
|
+
|
18
|
+
function default_proxy() {
|
19
|
+
return "PROXY 127.0.0.1:3128";
|
20
|
+
}
|
21
|
+
|
22
|
+
function no_proxy() {
|
23
|
+
return "DIRECT";
|
24
|
+
}
|
25
|
+
|
26
|
+
function socks_proxy() {
|
27
|
+
return "SOCKS 127.0.0.1:1080";
|
28
|
+
}
|
29
|
+
|
30
|
+
function reach_directly(url, host, host_ip) {
|
31
|
+
|
32
|
+
return isPlainHostName(host) ||
|
33
|
+
host == "localhost" ||
|
34
|
+
shExpMatch(host, "localhost.*") ||
|
35
|
+
host == "127.0.0.1" ||
|
36
|
+
dnsDomainIs ( host , ".example.org") ||
|
37
|
+
dnsDomainIs ( host , ".in.example.org");
|
38
|
+
}
|
39
|
+
|
40
|
+
function reach_via_socks(url, host, host_ip) {
|
41
|
+
return host == "server.example.org");
|
42
|
+
}
|
@@ -0,0 +1,51 @@
|
|
1
|
+
// Taken from http://findproxyforurl.com/pac-functions/. Please see this site
|
2
|
+
// for an explanation for the snippets found below.
|
3
|
+
|
4
|
+
function FindProxyForURL(url, host) {
|
5
|
+
if (dnsDomainIs(host, ".google.com"))
|
6
|
+
return "DIRECT";
|
7
|
+
|
8
|
+
if (shExpMatch(url, "*.local"))
|
9
|
+
return "DIRECT";
|
10
|
+
|
11
|
+
if (shExpMatch(host, "vpn.domain.com") ||
|
12
|
+
shExpMatch(url, "http://abcdomain.com/folder/*"))
|
13
|
+
return "DIRECT";
|
14
|
+
|
15
|
+
if (isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0"))
|
16
|
+
return "DIRECT";
|
17
|
+
|
18
|
+
|
19
|
+
if (isInNet(myIpAddress(), "10.10.1.0", "255.255.255.0"))
|
20
|
+
return "PROXY 10.10.5.1:8080";
|
21
|
+
|
22
|
+
if (isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||
|
23
|
+
isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0") ||
|
24
|
+
isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0") ||
|
25
|
+
isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0"))
|
26
|
+
return "DIRECT";
|
27
|
+
|
28
|
+
if (isPlainHostName(host))
|
29
|
+
return "DIRECT";
|
30
|
+
|
31
|
+
if (localHostOrDomainIs(host, "www.google.com"))
|
32
|
+
return "DIRECT";
|
33
|
+
|
34
|
+
if (localHostOrDomainIs(host, ".google.com"))
|
35
|
+
return "DIRECT";
|
36
|
+
|
37
|
+
|
38
|
+
if (isResolvable(host))
|
39
|
+
return "PROXY proxy1.example.com:8080";
|
40
|
+
if (dnsDomainLevels(host) > 0)
|
41
|
+
return "PROXY proxy1.example.com:8080";
|
42
|
+
else return "DIRECT";
|
43
|
+
|
44
|
+
if (weekdayRange("MON", "FRI")) return "PROXY proxy1.example.com:8080";
|
45
|
+
else return "DIRECT";
|
46
|
+
if (dateRange("JAN", "MAR")) return "PROXY proxy1.example.com:8080";
|
47
|
+
else return "DIRECT";
|
48
|
+
if (timeRange(8, 18)) return "PROXY proxy1.example.com:8080";
|
49
|
+
else return "DIRECT";
|
50
|
+
|
51
|
+
}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module LocalPac
|
3
|
+
module Actions
|
4
|
+
class AddExamplesToLocalStorage
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
attr_reader :repo, :files, :options, :vcs_engine, :storage_path
|
9
|
+
|
10
|
+
public
|
11
|
+
|
12
|
+
def initialize(storage_path, options = {}, vcs_engine = GitRepository)
|
13
|
+
@options = options
|
14
|
+
@vcs_engine = vcs_engine
|
15
|
+
@storage_path = storage_path
|
16
|
+
end
|
17
|
+
|
18
|
+
def run
|
19
|
+
@files = Dir.glob(::File.expand_path('../../../../files/examples/*', __FILE__)).collect do |f|
|
20
|
+
OpenStruct.new(repo_path: "examples/#{::File.basename(f)}", name: "examples::#{::File.basename(f).sub(/\.[^.]+$/, '')}".to_sym, content: ::File.read(f))
|
21
|
+
end
|
22
|
+
@files << OpenStruct.new(repo_path: 'proxy.pac', name: :proxy, content: ::File.read(::File.expand_path('../../../../files/proxy.pac', __FILE__)))
|
23
|
+
|
24
|
+
begin
|
25
|
+
@repo = vcs_engine.new(storage_path)
|
26
|
+
rescue Rugged::OSError
|
27
|
+
raise Exceptions::RepositoryDoesNotExist, "Sorry, but the repository at #{storage_path} does not exist" unless ::Dir.exists? storage_path
|
28
|
+
end
|
29
|
+
|
30
|
+
if need_to_run? || options[:force] == true
|
31
|
+
files.each { |f| repo.add_content(f.repo_path, f.content) }
|
32
|
+
repo.add_content('proxy.pac', ::File.read(::File.expand_path('../../../../files/proxy.pac', __FILE__)))
|
33
|
+
else
|
34
|
+
LocalPac.ui_logger.warn "Example files already exists. Do not create them again!."
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def need_to_run?
|
41
|
+
files.any? { |f| repo.find_file(f.name).nil? }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/local_pac/file.rb
CHANGED
@@ -13,7 +13,7 @@ module LocalPac
|
|
13
13
|
def initialize(path, content = '')
|
14
14
|
@path = path
|
15
15
|
@extension = ::File.extname(path)
|
16
|
-
@name = path.sub(
|
16
|
+
@name = path.sub(/\.[^.]+$/, '').gsub(%r{/}, '::').downcase.to_sym
|
17
17
|
@content = content
|
18
18
|
end
|
19
19
|
|
@@ -3,15 +3,18 @@ module LocalPac
|
|
3
3
|
class GitRepository
|
4
4
|
private
|
5
5
|
|
6
|
-
attr_reader :repository, :root_commit
|
6
|
+
attr_reader :repository, :root_commit, :null_file, :file_creator
|
7
7
|
|
8
8
|
public
|
9
9
|
|
10
10
|
attr_reader :storage_path
|
11
11
|
|
12
|
-
def initialize(storage_path)
|
12
|
+
def initialize(storage_path, file_creator = LocalPac::File, null_file = LocalPac::NullFile.new)
|
13
13
|
@storage_path = ::File.expand_path(storage_path)
|
14
14
|
@repository = Rugged::Repository.new(storage_path)
|
15
|
+
@file_creator = file_creator
|
16
|
+
@null_file = null_file
|
17
|
+
|
15
18
|
rescue Rugged::RepositoryError
|
16
19
|
raise Exceptions::RepositoryDoesNotExist, "Sorry, but #{storage_path} is not a git repository."
|
17
20
|
end
|
@@ -48,8 +51,41 @@ module LocalPac
|
|
48
51
|
Rugged::Commit.create(repository, options)
|
49
52
|
end
|
50
53
|
|
54
|
+
def find_file(name)
|
55
|
+
files.fetch(name, null_file)
|
56
|
+
end
|
57
|
+
|
58
|
+
def all_files
|
59
|
+
files
|
60
|
+
end
|
61
|
+
|
62
|
+
def each_file(&block)
|
63
|
+
files.each(&block)
|
64
|
+
end
|
65
|
+
|
51
66
|
private
|
52
67
|
|
68
|
+
def files
|
69
|
+
files_in_repository.reduce({}) do |memo, file|
|
70
|
+
memo[file.name.to_sym] = file
|
71
|
+
|
72
|
+
memo
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def files_in_repository
|
77
|
+
return [] if repository.empty?
|
78
|
+
|
79
|
+
head_commit = repository.lookup(repository.head.target)
|
80
|
+
|
81
|
+
files = []
|
82
|
+
head_commit.tree.walk_blobs(:postorder) do |root, entry|
|
83
|
+
files << file_creator.new("#{root}#{entry[:name]}", repository.lookup(entry[:oid]).content )
|
84
|
+
end
|
85
|
+
|
86
|
+
files
|
87
|
+
end
|
88
|
+
|
53
89
|
def default_commit_info
|
54
90
|
options = {}
|
55
91
|
options[:author] = { :email => 'local_pac@local_pac', :name => 'Local Pac', :time => Time.now }
|
@@ -3,7 +3,7 @@ module LocalPac
|
|
3
3
|
|
4
4
|
private
|
5
5
|
|
6
|
-
attr_reader :config, :
|
6
|
+
attr_reader :config, :options
|
7
7
|
|
8
8
|
public
|
9
9
|
|
@@ -31,7 +31,12 @@ module LocalPac
|
|
31
31
|
LocalPac.ui_logger.info "Creating config file at \"#{config.config_file}\"."
|
32
32
|
Actions::CreateFile.new(:'example-config', config.config_file, Data.new(config), force: options[:force], create_directories: true).run
|
33
33
|
|
34
|
-
|
34
|
+
if options[:pre_seed]
|
35
|
+
LocalPac.ui_logger.info "Adding examples to repository at #{config.local_storage}/examples"
|
36
|
+
Actions::AddExamplesToLocalStorage.new(config.local_storage).run
|
37
|
+
end
|
38
|
+
|
39
|
+
LocalPac.ui_logger.info "Showing the configuration of local_pac on your system."
|
35
40
|
Actions::CreateOutput.new(:'example-config', $stdout, Data.new(config)).run
|
36
41
|
end
|
37
42
|
end
|
data/lib/local_pac/version.rb
CHANGED
data/lib/local_pac.rb
CHANGED
@@ -29,7 +29,6 @@ require 'local_pac/ui_logger'
|
|
29
29
|
|
30
30
|
LocalPac.ui_logger.level = ::Logger::UNKNOWN
|
31
31
|
|
32
|
-
require 'local_pac/git'
|
33
32
|
require 'local_pac/git_repository'
|
34
33
|
require 'local_pac/git_storage'
|
35
34
|
require 'local_pac/config'
|
@@ -55,6 +54,7 @@ require 'local_pac/actions/show_process_information'
|
|
55
54
|
require 'local_pac/actions/print_title'
|
56
55
|
require 'local_pac/actions/reload_configuration'
|
57
56
|
require 'local_pac/actions/reload_local_storage'
|
57
|
+
require 'local_pac/actions/add_examples_to_local_storage'
|
58
58
|
require 'local_pac/cli/helper'
|
59
59
|
require 'local_pac/cli/reload'
|
60
60
|
require 'local_pac/initializer'
|
data/share/archlinux/PKGBUILD
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Maintainer: Max Meyer <dev@fedux.org>
|
2
2
|
pkgname=local_pac
|
3
|
-
pkgver=0.
|
4
|
-
pkgrel=
|
3
|
+
pkgver=0.2.0
|
4
|
+
pkgrel=1
|
5
5
|
pkgdesc="local pacfile serving server"
|
6
6
|
arch=(i686 x86_64)
|
7
7
|
url="https://github.com/dg-vrnetze/${pkgname}"
|
@@ -11,10 +11,7 @@ install=${pkgname}.install
|
|
11
11
|
makedepends=(rubygems filegen phantomjs)
|
12
12
|
source=(http://gems.rubyforge.org/gems/$pkgname-$pkgver.gem)
|
13
13
|
noextract=($pkgname-$pkgver.gem)
|
14
|
-
sha256sums=('
|
15
|
-
|
16
|
-
test() {
|
17
|
-
}
|
14
|
+
sha256sums=('1ed00dd8054c57beb92ccbd7fc91e1698e3d673f16d79bf565760ac12136c823')
|
18
15
|
|
19
16
|
package() {
|
20
17
|
cd "$srcdir"
|
@@ -35,7 +32,7 @@ package() {
|
|
35
32
|
install -d ${pkgdir}$_log_dir
|
36
33
|
install -d ${pkgdir}$_config_dir
|
37
34
|
|
38
|
-
msg "Starting download of gems. Don't get alert
|
35
|
+
msg "Starting download of gems. Don't get alert if the download takes a lot of time. Since rubygems 2.2.0 a new algorithm to resolve dependencies is used. Upgrade to > 2.2.0 via sudo /usr/bin/gem update --system to improve performance."
|
39
36
|
|
40
37
|
GEM_HOME="${pkgdir}${_library_dir}" GEM_ROOT="${pkgdir}${_library_dir}" GEM_PATH="${pkgdir}${_library_dir}" /usr/bin/gem install --env-shebang --wrappers --no-ri --no-rdoc --no-prerelease --install-dir ${pkgdir}${_library_dir} $pkgname puma
|
41
38
|
|
@@ -51,7 +48,7 @@ package() {
|
|
51
48
|
install -D -m644 ${pkgdir}/$_share_dir/systemd/${pkgname}@.service ${pkgdir}/$_systemd_dir/${pkgname}@.service
|
52
49
|
#install -D -m644 ${pkgdir}/$_share_dir/systemd/${pkgname}.socket ${pkgdir}/$_systemd_dir
|
53
50
|
|
54
|
-
install -D -m644 ${pkgdir}${_share_dir}
|
51
|
+
install -D -m644 ${pkgdir}${_share_dir}/../../LICENSE.md "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE"
|
55
52
|
}
|
56
53
|
|
57
54
|
# vim:set ts=2 sw=2 et:
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Actions::AddExamplesToLocalStorage do
|
5
|
+
context '#initialize' do
|
6
|
+
it 'requires a path to local storage' do
|
7
|
+
repo = GitRepository.create(working_directory)
|
8
|
+
|
9
|
+
expect {
|
10
|
+
Actions::AddExamplesToLocalStorage.new(working_directory)
|
11
|
+
}.not_to raise_error
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context '#run' do
|
16
|
+
it 'fails if Storage path does not exist' do
|
17
|
+
action = Actions::AddExamplesToLocalStorage.new('local_storage')
|
18
|
+
expect {
|
19
|
+
action.run
|
20
|
+
}.to raise_error Exceptions::RepositoryDoesNotExist
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'creates files' do
|
24
|
+
repo = GitRepository.create(working_directory)
|
25
|
+
action = Actions::AddExamplesToLocalStorage.new(working_directory)
|
26
|
+
action.run
|
27
|
+
|
28
|
+
expect(repo.find_file('examples::proxy-complex.pac'.to_sym).name).to eq(:'examples::proxy-complex.pac')
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'forces creation' do
|
32
|
+
repo = GitRepository.create(working_directory)
|
33
|
+
action = Actions::AddExamplesToLocalStorage.new(working_directory)
|
34
|
+
action.run
|
35
|
+
|
36
|
+
result = capture(:stderr) do
|
37
|
+
LocalPac.ui_logger.level = ::Logger::INFO
|
38
|
+
action.run
|
39
|
+
end
|
40
|
+
|
41
|
+
expect(result).to include('already')
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -12,14 +12,11 @@ describe 'Fetch proxy pac', :type => :feature do
|
|
12
12
|
|
13
13
|
let(:compressed_valid_pac_file) { "function FindProxyForURL(){return\"DIRECT\"}" }
|
14
14
|
|
15
|
-
let(:git_repo) { 'git_repo' }
|
15
|
+
let(:git_repo) { File.join(working_directory, 'git_repo.git') }
|
16
16
|
|
17
17
|
before :each do
|
18
|
-
|
19
|
-
|
20
|
-
create_file(::File.join(git_repo, 'file.pac'), valid_pac_file)
|
21
|
-
git_add(git_repo, 'file.pac')
|
22
|
-
git_commit(git_repo)
|
18
|
+
repo = GitRepository.create(git_repo)
|
19
|
+
repo.add_content('file.pac', valid_pac_file)
|
23
20
|
end
|
24
21
|
|
25
22
|
before :each do
|
@@ -31,7 +28,7 @@ describe 'Fetch proxy pac', :type => :feature do
|
|
31
28
|
end
|
32
29
|
|
33
30
|
def local_storage
|
34
|
-
::File.join(working_directory, 'git_repo
|
31
|
+
::File.join(working_directory, 'git_repo.git')
|
35
32
|
end
|
36
33
|
end.new
|
37
34
|
|
@@ -59,7 +56,7 @@ describe 'Fetch proxy pac', :type => :feature do
|
|
59
56
|
end
|
60
57
|
|
61
58
|
def local_storage
|
62
|
-
::File.join(working_directory, 'git_repo
|
59
|
+
::File.join(working_directory, 'git_repo.git')
|
63
60
|
end
|
64
61
|
end.new
|
65
62
|
|
@@ -83,7 +80,7 @@ describe 'Fetch proxy pac', :type => :feature do
|
|
83
80
|
end
|
84
81
|
|
85
82
|
def local_storage
|
86
|
-
::File.join(working_directory, 'git_repo
|
83
|
+
::File.join(working_directory, 'git_repo.git')
|
87
84
|
end
|
88
85
|
end.new
|
89
86
|
|
@@ -25,14 +25,11 @@ describe 'Lookup proxy for url' do
|
|
25
25
|
EOS
|
26
26
|
end
|
27
27
|
|
28
|
-
let(:git_repo) { 'git_repo' }
|
29
|
-
|
30
|
-
before
|
31
|
-
|
32
|
-
|
33
|
-
create_file(::File.join(git_repo, 'file.pac'), valid_pac_file)
|
34
|
-
git_add(git_repo, 'file.pac')
|
35
|
-
git_commit(git_repo)
|
28
|
+
let(:git_repo) { File.join(working_directory, 'git_repo.git') }
|
29
|
+
|
30
|
+
before :each do
|
31
|
+
repo = GitRepository.create(git_repo)
|
32
|
+
repo.add_content('file.pac', valid_pac_file)
|
36
33
|
end
|
37
34
|
|
38
35
|
before :each do
|
@@ -44,7 +41,7 @@ describe 'Lookup proxy for url' do
|
|
44
41
|
end
|
45
42
|
|
46
43
|
def local_storage
|
47
|
-
::File.join(working_directory, 'git_repo
|
44
|
+
::File.join(working_directory, 'git_repo.git')
|
48
45
|
end
|
49
46
|
end.new
|
50
47
|
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe GitRepository do
|
5
|
+
context '#initialize' do
|
6
|
+
it 'requires a storage path' do
|
7
|
+
file_creator = double('file_creator')
|
8
|
+
null_file = double('null_file')
|
9
|
+
|
10
|
+
Rugged::Repository.init_at(File.join(working_directory, 'git_repo'))
|
11
|
+
|
12
|
+
expect {
|
13
|
+
GitRepository.new(File.join(working_directory, 'git_repo'), file_creator, null_file)
|
14
|
+
}.not_to raise_error
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context '#find_file' do
|
19
|
+
it 'returns a file if exists in repository' do
|
20
|
+
repo_path = File.join(working_directory, 'git_repo')
|
21
|
+
Rugged::Repository.init_at(repo_path)
|
22
|
+
|
23
|
+
file = double('file')
|
24
|
+
allow(file).to receive(:name).and_return(:file)
|
25
|
+
|
26
|
+
file_creator = double('file_creator')
|
27
|
+
allow(file_creator).to receive(:new).with('file.txt', 'asdf').and_return(file)
|
28
|
+
|
29
|
+
null_file = double('null_file')
|
30
|
+
|
31
|
+
repo = GitRepository.new(repo_path, file_creator, null_file)
|
32
|
+
repo.add_content('file.txt', 'asdf')
|
33
|
+
f = repo.find_file(:file)
|
34
|
+
|
35
|
+
expect(f).to be(file)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'returns a null file if does not exist in repository' do
|
39
|
+
repo_path = File.join(working_directory, 'git_repo')
|
40
|
+
Rugged::Repository.init_at(repo_path)
|
41
|
+
|
42
|
+
file_creator = double('file_creator')
|
43
|
+
null_file = double('null_file')
|
44
|
+
|
45
|
+
repo = GitRepository.new(repo_path, file_creator, null_file)
|
46
|
+
f = repo.find_file(:file)
|
47
|
+
|
48
|
+
expect(f).to be(null_file)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'handles uninitialized repositories' do
|
52
|
+
repo_path = File.join(working_directory, 'git_repo')
|
53
|
+
Rugged::Repository.init_at(repo_path)
|
54
|
+
|
55
|
+
file_creator = double('file_creator')
|
56
|
+
null_file = double('null_file')
|
57
|
+
|
58
|
+
repo = GitRepository.new(repo_path, file_creator, null_file)
|
59
|
+
f = repo.find_file(:file)
|
60
|
+
|
61
|
+
expect(f).to be(null_file)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/spec/initializer_spec.rb
CHANGED
@@ -14,7 +14,7 @@ describe Initializer do
|
|
14
14
|
:config_file: #{File.join(working_directory, 'config', 'config.yaml')}
|
15
15
|
:gem_path: []
|
16
16
|
EOS
|
17
|
-
config_file = create_file('
|
17
|
+
config_file = create_file('config_spec.yaml', config_string)
|
18
18
|
|
19
19
|
config = LocalPac::Config.new(config_file)
|
20
20
|
initializer = Initializer.new({}, config)
|
@@ -32,5 +32,29 @@ describe Initializer do
|
|
32
32
|
expect(path_exists?('run')).to be_true
|
33
33
|
expect(result).to include("access_log: #{File.expand_path(::File.join(working_directory, 'log', 'access.log'))}")
|
34
34
|
end
|
35
|
+
|
36
|
+
it 'adds examples on request' do
|
37
|
+
config_string = <<-EOS.strip_heredoc
|
38
|
+
:access_log: #{File.join(working_directory, 'log', 'access.log')}
|
39
|
+
:local_storage: #{File.join(working_directory, 'data', 'storage.git')}
|
40
|
+
:executable: #{File.join(working_directory, 'bin', 'local_pac')}
|
41
|
+
:pid_file: #{File.join(working_directory, 'run', 'pid')}
|
42
|
+
:sass_cache: #{File.join(working_directory, 'cache', 'sass')}
|
43
|
+
:config_file: #{File.join(working_directory, 'config', 'config.yaml')}
|
44
|
+
:gem_path: []
|
45
|
+
EOS
|
46
|
+
config_file = create_file('config_spec.yaml', config_string)
|
47
|
+
|
48
|
+
config = LocalPac::Config.new(config_file)
|
49
|
+
initializer = Initializer.new({pre_seed: true}, config)
|
50
|
+
silence(:stdout) do
|
51
|
+
silence(:stderr) do
|
52
|
+
initializer.run
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
repo = GitRepository.new(config.local_storage)
|
57
|
+
expect(repo.find_file(:proxy).name).to eq(:proxy)
|
58
|
+
end
|
35
59
|
end
|
36
60
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: local_pac
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-02-
|
12
|
+
date: 2014-02-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
@@ -428,17 +428,21 @@ files:
|
|
428
428
|
- app/views/lookup_result.haml
|
429
429
|
- bin/local_pac
|
430
430
|
- config.ru
|
431
|
-
- features/fetch_proxy_pac.
|
432
|
-
- features/initializer.
|
433
|
-
- features/show_status.
|
431
|
+
- features/fetch_proxy_pac.feature_
|
432
|
+
- features/initializer.feature_
|
433
|
+
- features/show_status.feature_
|
434
434
|
- features/step_definitions.rb
|
435
435
|
- features/support/env.rb
|
436
436
|
- files/config.yaml
|
437
437
|
- files/example-config.erb
|
438
|
+
- files/examples/proxy-complex.pac.example
|
439
|
+
- files/examples/proxy-function_demo.pac.example
|
440
|
+
- files/examples/proxy.pac.example
|
438
441
|
- files/git-hook.erb
|
439
442
|
- files/proxy.pac
|
440
443
|
- lib/local_pac.rb
|
441
444
|
- lib/local_pac/access_logger.rb
|
445
|
+
- lib/local_pac/actions/add_examples_to_local_storage.rb
|
442
446
|
- lib/local_pac/actions/create_directory.rb
|
443
447
|
- lib/local_pac/actions/create_file.rb
|
444
448
|
- lib/local_pac/actions/create_output.rb
|
@@ -459,7 +463,6 @@ files:
|
|
459
463
|
- lib/local_pac/erb_generator.rb
|
460
464
|
- lib/local_pac/exceptions.rb
|
461
465
|
- lib/local_pac/file.rb
|
462
|
-
- lib/local_pac/git.rb
|
463
466
|
- lib/local_pac/git_repository.rb
|
464
467
|
- lib/local_pac/git_storage.rb
|
465
468
|
- lib/local_pac/initializer.rb
|
@@ -498,6 +501,7 @@ files:
|
|
498
501
|
- share/systemd/local_pac.service
|
499
502
|
- share/systemd/local_pac.socket
|
500
503
|
- share/systemd/local_pac@.service
|
504
|
+
- spec/actions/add_examples_to_local_storage_spec.rb
|
501
505
|
- spec/actions/create_directory_spec.rb
|
502
506
|
- spec/actions/create_file_spec.rb
|
503
507
|
- spec/actions/create_output_spec.rb
|
@@ -517,7 +521,7 @@ files:
|
|
517
521
|
- spec/features/fetch_proxy_pac_spec.rb
|
518
522
|
- spec/features/lookup_proxy_spec.rb
|
519
523
|
- spec/file_spec.rb
|
520
|
-
- spec/
|
524
|
+
- spec/git_repository_spec.rb
|
521
525
|
- spec/git_storage_spec.rb
|
522
526
|
- spec/initializer_spec.rb
|
523
527
|
- spec/java_script_compressor_spec.rb
|
@@ -539,7 +543,6 @@ files:
|
|
539
543
|
- spec/support/config.rb
|
540
544
|
- spec/support/environment.rb
|
541
545
|
- spec/support/filesystem.rb
|
542
|
-
- spec/support/git.rb
|
543
546
|
- spec/support/helper_features.rb
|
544
547
|
- spec/support/rack_test.rb
|
545
548
|
- spec/support/reporting.rb
|
@@ -573,11 +576,12 @@ signing_key:
|
|
573
576
|
specification_version: 3
|
574
577
|
summary: Serve local proxy pac
|
575
578
|
test_files:
|
576
|
-
- features/fetch_proxy_pac.
|
577
|
-
- features/initializer.
|
578
|
-
- features/show_status.
|
579
|
+
- features/fetch_proxy_pac.feature_
|
580
|
+
- features/initializer.feature_
|
581
|
+
- features/show_status.feature_
|
579
582
|
- features/step_definitions.rb
|
580
583
|
- features/support/env.rb
|
584
|
+
- spec/actions/add_examples_to_local_storage_spec.rb
|
581
585
|
- spec/actions/create_directory_spec.rb
|
582
586
|
- spec/actions/create_file_spec.rb
|
583
587
|
- spec/actions/create_output_spec.rb
|
@@ -597,7 +601,7 @@ test_files:
|
|
597
601
|
- spec/features/fetch_proxy_pac_spec.rb
|
598
602
|
- spec/features/lookup_proxy_spec.rb
|
599
603
|
- spec/file_spec.rb
|
600
|
-
- spec/
|
604
|
+
- spec/git_repository_spec.rb
|
601
605
|
- spec/git_storage_spec.rb
|
602
606
|
- spec/initializer_spec.rb
|
603
607
|
- spec/java_script_compressor_spec.rb
|
@@ -619,7 +623,6 @@ test_files:
|
|
619
623
|
- spec/support/config.rb
|
620
624
|
- spec/support/environment.rb
|
621
625
|
- spec/support/filesystem.rb
|
622
|
-
- spec/support/git.rb
|
623
626
|
- spec/support/helper_features.rb
|
624
627
|
- spec/support/rack_test.rb
|
625
628
|
- spec/support/reporting.rb
|
data/lib/local_pac/git.rb
DELETED
@@ -1,77 +0,0 @@
|
|
1
|
-
module LocalPac
|
2
|
-
class Git
|
3
|
-
def self.ls_files(filter = nil)
|
4
|
-
cmd = ['git ls-files']
|
5
|
-
cmd << filter if filter
|
6
|
-
|
7
|
-
runner = Runner.new(cmd.join(" "))
|
8
|
-
runner.result
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.config(option, value, git_dir, is_global = true)
|
12
|
-
cmd = ['git']
|
13
|
-
cmd << "--git-dir #{git_dir}" if git_dir
|
14
|
-
cmd << 'config'
|
15
|
-
cmd << option
|
16
|
-
cmd << "\"#{value}\""
|
17
|
-
cmd << "--global" if is_global
|
18
|
-
|
19
|
-
runner = Runner.new(cmd.join(" "))
|
20
|
-
runner.result
|
21
|
-
end
|
22
|
-
|
23
|
-
|
24
|
-
def self.ls_tree(git_dir = nil, filter = nil)
|
25
|
-
cmd = ['git']
|
26
|
-
cmd << "--git-dir #{git_dir}" if git_dir
|
27
|
-
cmd << 'ls-tree -r HEAD'
|
28
|
-
cmd << filter if filter
|
29
|
-
|
30
|
-
runner = Runner.new(cmd.join(" "))
|
31
|
-
runner.result
|
32
|
-
end
|
33
|
-
|
34
|
-
def self.init(path, is_bare = false)
|
35
|
-
if is_bare
|
36
|
-
Rugged::Repository.init_at(path, :bare)
|
37
|
-
else
|
38
|
-
Rugged::Repository.init_at(path)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def self.add(object)
|
43
|
-
runner = Runner.new("git add #{object}")
|
44
|
-
runner.result
|
45
|
-
end
|
46
|
-
|
47
|
-
def self.commit(message)
|
48
|
-
runner = Runner.new("git commit -m \"#{message}\"")
|
49
|
-
runner.result
|
50
|
-
end
|
51
|
-
|
52
|
-
def self.status
|
53
|
-
runner = Runner.new('git status')
|
54
|
-
runner.result
|
55
|
-
end
|
56
|
-
|
57
|
-
def self.show(sha = nil, git_dir = nil)
|
58
|
-
cmd = ['git']
|
59
|
-
cmd << "--git-dir #{git_dir}" if git_dir
|
60
|
-
cmd << 'show'
|
61
|
-
cmd << " #{sha}" if sha
|
62
|
-
|
63
|
-
runner = Runner.new(cmd.join(" "))
|
64
|
-
runner.result
|
65
|
-
end
|
66
|
-
|
67
|
-
def self.cat_file(sha, git_dir = nil)
|
68
|
-
cmd = ['git']
|
69
|
-
cmd << "--git-dir #{git_dir}" if git_dir
|
70
|
-
cmd << 'cat-file -p'
|
71
|
-
cmd << sha
|
72
|
-
|
73
|
-
runner = Runner.new(cmd.join(" "))
|
74
|
-
runner.result
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
data/spec/git_spec.rb
DELETED
@@ -1,106 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require 'spec_helper'
|
3
|
-
|
4
|
-
describe Git do
|
5
|
-
let(:git_repo) { 'git_repo' }
|
6
|
-
|
7
|
-
context '#init' do
|
8
|
-
it 'creates a new repository' do
|
9
|
-
switch_to_working_directory do
|
10
|
-
Git.init(git_repo)
|
11
|
-
end
|
12
|
-
|
13
|
-
expect(path_exists?(git_repo)).to be_true
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
context '#ls_tree' do
|
18
|
-
it 'list files in repo' do
|
19
|
-
git_init(git_repo)
|
20
|
-
git_set_author(git_repo)
|
21
|
-
create_file(::File.join(git_repo, 'file.txt'))
|
22
|
-
git_add(git_repo, 'file.txt')
|
23
|
-
git_commit(git_repo)
|
24
|
-
|
25
|
-
Dir.chdir(::File.join(working_directory, git_repo)) do
|
26
|
-
expect(Git.ls_tree.first).to include('file.txt')
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
context '#ls_files' do
|
32
|
-
it 'list files in repo' do
|
33
|
-
git_init(git_repo)
|
34
|
-
git_set_author(git_repo)
|
35
|
-
create_file(::File.join(git_repo, 'file.txt'))
|
36
|
-
git_add(git_repo, 'file.txt')
|
37
|
-
git_commit(git_repo)
|
38
|
-
|
39
|
-
Dir.chdir(::File.join(working_directory, git_repo)) do
|
40
|
-
expect(Git.ls_files).to include('file.txt')
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'list files in repo and filter' do
|
45
|
-
git_init(git_repo)
|
46
|
-
git_set_author(git_repo)
|
47
|
-
create_file(::File.join(git_repo, 'file1.txt'))
|
48
|
-
git_add(git_repo, 'file1.txt')
|
49
|
-
|
50
|
-
create_file(::File.join(git_repo, 'file2.txt'))
|
51
|
-
git_add(git_repo, 'file2.txt')
|
52
|
-
|
53
|
-
git_commit(git_repo)
|
54
|
-
|
55
|
-
Dir.chdir(::File.join(working_directory, git_repo)) do
|
56
|
-
expect(Git.ls_files('file1.txt')).to eq(['file1.txt'])
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
context '#add' do
|
62
|
-
it 'add dir/file to repository' do
|
63
|
-
git_init(git_repo)
|
64
|
-
git_set_author(git_repo)
|
65
|
-
create_file(::File.join(git_repo, 'file.txt'))
|
66
|
-
|
67
|
-
Dir.chdir(::File.join(working_directory, git_repo)) do
|
68
|
-
Git.add('file.txt')
|
69
|
-
end
|
70
|
-
|
71
|
-
expect(git_status(git_repo)).to include("\tnew file: file.txt")
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
context '#commit' do
|
76
|
-
it 'commit dir/file to repository' do
|
77
|
-
|
78
|
-
git_init(git_repo)
|
79
|
-
git_set_author(git_repo)
|
80
|
-
|
81
|
-
create_file(::File.join(git_repo, 'file.txt'))
|
82
|
-
|
83
|
-
git_add(git_repo, 'file.txt')
|
84
|
-
|
85
|
-
Dir.chdir(::File.join(working_directory, git_repo)) do
|
86
|
-
Git.commit('file.txt')
|
87
|
-
end
|
88
|
-
|
89
|
-
expect(git_status(git_repo)).to include('nothing to commit, working directory clean')
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
context '#show' do
|
94
|
-
it 'show ref/sha in repository' do
|
95
|
-
git_init(git_repo)
|
96
|
-
git_set_author(git_repo)
|
97
|
-
create_file(::File.join(git_repo, 'file.txt'))
|
98
|
-
git_add(git_repo, 'file.txt')
|
99
|
-
git_commit(git_repo)
|
100
|
-
|
101
|
-
Dir.chdir(::File.join(working_directory, git_repo)) do
|
102
|
-
expect(Git.show.first).to include('commit')
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
data/spec/support/git.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
require 'fedux_org/stdlib/filesystem'
|
2
|
-
|
3
|
-
module LocalPac
|
4
|
-
module SpecHelper
|
5
|
-
module GitHelper
|
6
|
-
include FeduxOrg::Stdlib::Filesystem
|
7
|
-
|
8
|
-
def root_directory
|
9
|
-
::File.expand_path('../../../', __FILE__)
|
10
|
-
end
|
11
|
-
|
12
|
-
def git_init(path)
|
13
|
-
switch_to_working_directory do
|
14
|
-
Git.init(path)
|
15
|
-
end
|
16
|
-
|
17
|
-
::File.join(working_directory, path)
|
18
|
-
end
|
19
|
-
|
20
|
-
def git_add(repo, object)
|
21
|
-
Dir.chdir(::File.join(working_directory, repo)) do
|
22
|
-
Git.add(object)
|
23
|
-
end
|
24
|
-
|
25
|
-
::File.join(working_directory, repo, object)
|
26
|
-
end
|
27
|
-
|
28
|
-
def git_status(repo)
|
29
|
-
Dir.chdir(::File.join(working_directory, repo)) do
|
30
|
-
Git.status
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def git_commit(repo, message = 'Yay... Added objects')
|
35
|
-
Dir.chdir(::File.join(working_directory, repo)) do
|
36
|
-
Git.commit(message)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def git_show(repo, sha)
|
41
|
-
Dir.chdir(::File.join(working_directory, repo)) do
|
42
|
-
Git.show(sha)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def git_ls_tree(repo)
|
47
|
-
Dir.chdir(::File.join(working_directory, repo)) do
|
48
|
-
Git.ls_tree
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def git_config(repo, option, value, is_global = false)
|
53
|
-
if is_global
|
54
|
-
Git.config(option, value, is_global)
|
55
|
-
else
|
56
|
-
Dir.chdir(::File.join(working_directory, repo)) do
|
57
|
-
Git.config(option, value, is_global)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def git_set_author(repo)
|
63
|
-
git_config(repo, 'user.email', 'user@local_pac')
|
64
|
-
git_config(repo, 'user.name', 'local_pac')
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
# encoding: utf-8
|
71
|
-
RSpec.configure do |c|
|
72
|
-
c.include LocalPac::SpecHelper::GitHelper
|
73
|
-
end
|