tunnelblick 0.0.1 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/tunnel_blick.rb +132 -36
- data/lib/tunnel_blick/express_vpn.rb +2 -2
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4f36c8ae27a7e36bf54072b78fa2681cc9387514
|
4
|
+
data.tar.gz: 73350a0eede1e321a4c4dee3a44a946897d0d4fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 66d8cf838fb232b4c6e4ad2d4de91f9a64e74dbd915fde14f8f9b1546d2f210e5788a0f26afc42b9e7c2c189f67dcbcd0050cf596a8f50cb32fe3d29fc9674bd
|
7
|
+
data.tar.gz: 12293c3f760876abf43c23a62dfa6a6caa536327ff62ffc9f8d9f76e59755e5ea72a610d27af7a11813919c09561a8b112915276cb1e3aff3faca35c14dd7662
|
data/lib/tunnel_blick.rb
CHANGED
@@ -1,62 +1,155 @@
|
|
1
|
+
require 'flex_config'
|
2
|
+
require 'flex_console'
|
3
|
+
require 'flex_pg'
|
4
|
+
require 'open-uri'
|
1
5
|
require 'rb-scpt'
|
2
6
|
require 'tunnel_blick/express_vpn'
|
3
7
|
|
4
8
|
include Appscript
|
5
9
|
|
6
|
-
|
10
|
+
class TunnelBlick
|
7
11
|
|
8
|
-
|
9
|
-
|
12
|
+
attr_accessor :tunnel, :module, :d_id, :my_ip, :max_requests, :arguments,
|
13
|
+
:doms, :allowance
|
14
|
+
attr_reader :database
|
10
15
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
def initialize (database = Dummy.new('dummy database'))
|
17
|
+
@config = FlexConfig.new('/Users/YCL/Documents/RubyProjects/gems/tunnel_blick', {})
|
18
|
+
@database = database
|
19
|
+
@tunnel = Appscript.app('Tunnelblick.app')
|
20
|
+
@websites = []
|
21
|
+
end
|
22
|
+
|
23
|
+
def manual
|
24
|
+
|
25
|
+
puts @my_ip = open('http://icanhazip.com').read.strip
|
26
|
+
database[:ip_addresses].insert_ignore.insert(:public_ip => @my_ip)
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_websites (*websites)
|
31
|
+
websites.each { |w|
|
32
|
+
w.tunnel = self
|
33
|
+
w.allowance = allowance
|
34
|
+
}
|
35
|
+
end
|
19
36
|
|
20
|
-
|
21
|
-
|
37
|
+
def config_match (file_name)
|
38
|
+
file_name
|
39
|
+
case file_name
|
40
|
+
when /\Amy_expressvpn.+/
|
41
|
+
#puts 'Express VPN'
|
42
|
+
@loaded_module = TunnelBlick::ExpressVPN
|
43
|
+
else
|
44
|
+
puts 'VPN not recognized.'
|
22
45
|
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def config_filter (countries)
|
49
|
+
countries
|
50
|
+
vpn_configs.inject([]) { |acc, conf|
|
51
|
+
config_match(conf)
|
52
|
+
details = @loaded_module.parse_config(conf)
|
53
|
+
if countries.include?(details[:country])
|
54
|
+
acc << conf
|
55
|
+
acc
|
56
|
+
else
|
57
|
+
acc
|
58
|
+
end
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
def reallocate
|
63
|
+
disconnect
|
64
|
+
@allowance = 0
|
65
|
+
connect_smart(max_requests, arguments, *doms)
|
66
|
+
end
|
23
67
|
|
24
|
-
|
68
|
+
def connect_smart (limit, args = {}, *domains)
|
69
|
+
@allowance = 0
|
70
|
+
blocked = true
|
25
71
|
|
26
|
-
|
72
|
+
while @allowance < 1 || blocked
|
73
|
+
database.disconnect
|
74
|
+
puts @my_ip = open('http://icanhazip.com').read.strip if my_ip.nil?
|
27
75
|
|
28
|
-
|
76
|
+
blocked = false
|
77
|
+
connect_rand(3, args) unless connected?
|
29
78
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
count += 1
|
34
|
-
end
|
79
|
+
allowances = domains.map { |dom|
|
80
|
+
limit - database[:browser_requests].where(ip_address: my_ip, domain: dom).count
|
81
|
+
}
|
35
82
|
|
36
|
-
|
37
|
-
|
38
|
-
|
83
|
+
domains.each { |dom|
|
84
|
+
result = database[:website_ip_status].where(public_ip: my_ip, website: dom, status: 'blocked').count
|
85
|
+
if result != 0
|
86
|
+
puts 'This ip is blocked'
|
87
|
+
blocked = true
|
88
|
+
break
|
39
89
|
end
|
90
|
+
}
|
91
|
+
puts @allowance = allowances.min
|
92
|
+
disconnect if @allowance < 1 || blocked
|
93
|
+
end
|
94
|
+
|
95
|
+
@max_requests = limit
|
96
|
+
@arguments = args
|
97
|
+
@doms = domains
|
98
|
+
|
99
|
+
@allowance
|
100
|
+
end
|
40
101
|
|
102
|
+
def connected?
|
103
|
+
vpn_states.include?('CONNECTED')
|
104
|
+
end
|
105
|
+
|
106
|
+
def connect_rand (extra_waits = 2, args = {})
|
107
|
+
|
108
|
+
unless connected?
|
109
|
+
puts 'connect_rand'
|
110
|
+
if args[:filter].nil?
|
111
|
+
tunnel.connect(vpn_configs.sample)
|
112
|
+
else
|
113
|
+
puts shortlist = config_filter(args[:filter])
|
114
|
+
tunnel.connect(shortlist.sample)
|
41
115
|
end
|
42
116
|
|
43
|
-
|
44
|
-
loaded_module = TunnelBlick::TunnelBlick.module
|
117
|
+
count = 0
|
45
118
|
|
46
|
-
|
47
|
-
|
119
|
+
while count <= extra_waits && !connected?
|
120
|
+
sleep(5)
|
121
|
+
count += 1
|
122
|
+
end
|
123
|
+
|
124
|
+
unless connected?
|
125
|
+
puts 'VPN did not connect in time'
|
126
|
+
return
|
127
|
+
end
|
48
128
|
|
49
|
-
def method_missing (method, *args, &block)
|
50
|
-
@tunnel.send(method, *args, &block)
|
51
129
|
end
|
52
130
|
|
131
|
+
config_file_name = vpn_configs[vpn_states.index('CONNECTED')]
|
132
|
+
config_match(config_file_name)
|
133
|
+
details = @loaded_module.parse_config(config_file_name)
|
134
|
+
|
135
|
+
sleep(3)
|
136
|
+
puts @my_ip = open('http://icanhazip.com').read.strip
|
137
|
+
|
138
|
+
details.store(:public_ip, my_ip)
|
139
|
+
|
140
|
+
sleep(6)
|
141
|
+
database[:ip_addresses].upsert(details)
|
53
142
|
end
|
54
143
|
|
55
|
-
def
|
56
|
-
|
57
|
-
TunnelBlick.tunnel.extend(TunnelBlick)
|
144
|
+
def method_missing (method, *args, &block)
|
145
|
+
tunnel.send(method, *args, &block)
|
58
146
|
end
|
59
147
|
|
148
|
+
# def self.included(base)
|
149
|
+
# TunnelBlick.tunnel = Appscript.app('Tunnelblick.app')
|
150
|
+
# TunnelBlick.tunnel.extend(TunnelBlick)
|
151
|
+
# end
|
152
|
+
|
60
153
|
def connected_vpn
|
61
154
|
p vpn_states
|
62
155
|
if vpn_state == 'CONNECTED'
|
@@ -67,7 +160,10 @@ module TunnelBlick
|
|
67
160
|
end
|
68
161
|
|
69
162
|
def disconnect
|
70
|
-
|
163
|
+
puts 'Disconnecting from prior tunnels'
|
164
|
+
tunnel.disconnect_all
|
165
|
+
puts 'Sleep(6)'
|
166
|
+
sleep(6)
|
71
167
|
end
|
72
168
|
|
73
169
|
def vpn_state
|
@@ -75,11 +171,11 @@ module TunnelBlick
|
|
75
171
|
end
|
76
172
|
|
77
173
|
def vpn_configs
|
78
|
-
|
174
|
+
configurations.name.get
|
79
175
|
end
|
80
176
|
|
81
177
|
def vpn_states
|
82
|
-
|
178
|
+
configurations.state.get
|
83
179
|
end
|
84
180
|
|
85
181
|
end
|
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'facets/hash/op_push'
|
2
2
|
require 'facets/string/titlecase'
|
3
3
|
|
4
|
-
|
4
|
+
class TunnelBlick
|
5
5
|
|
6
6
|
module ExpressVPN
|
7
7
|
|
8
8
|
class << self
|
9
9
|
|
10
10
|
def parse_config (string)
|
11
|
-
details = {}
|
11
|
+
details = {provider: 'ExpressVPN'}
|
12
12
|
|
13
13
|
string = string.sub('my_expressvpn_', '')
|
14
14
|
string.sub!(/_\D{3}\z/, '')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tunnelblick
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eugene Lai
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-03-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: facets
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: flex_config
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rb-scpt
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|