girl 9.1.2 → 9.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/girl/dns.rb +52 -55
- data/lib/girl/head.rb +2 -2
- data/lib/girl/proxy.rb +66 -75
- data/lib/girl/proxy_worker.rb +968 -978
- data/lib/girl/proxyd.rb +55 -58
- data/lib/girl/proxyd_worker.rb +626 -629
- data/lib/girl/version.rb +1 -1
- metadata +3 -6
data/lib/girl/proxyd_worker.rb
CHANGED
|
@@ -38,24 +38,24 @@ module Girl
|
|
|
38
38
|
is_debug,
|
|
39
39
|
is_server_fastopen )
|
|
40
40
|
|
|
41
|
-
@nameserver_addrs = nameservers.map{
|
|
41
|
+
@nameserver_addrs = nameservers.map{|n| Socket.sockaddr_in(53, n)}
|
|
42
42
|
@reset_traff_day = reset_traff_day
|
|
43
|
-
@update_roles = [
|
|
43
|
+
@update_roles = [:dns, :dst, :mem, :p2, :proxy, :rsv] # 参与淘汰的角色
|
|
44
44
|
@updates_limit = 1011 - ims.size # 淘汰池上限,1015(mac) - info, infod, memd, proxyd, p2ds(=ims)
|
|
45
45
|
@eliminate_count = 0 # 淘汰次数
|
|
46
46
|
@reads = [] # 读池
|
|
47
47
|
@writes = [] # 写池
|
|
48
48
|
@roles = {} # sock => :dns / :dst / :infod / :mem / :memd / :p2 / :p2d / :proxy / :proxyd / :rsv
|
|
49
49
|
@updates = {} # sock => updated_at
|
|
50
|
-
@proxy_infos = {} # proxy => {
|
|
51
|
-
@im_infos = {} # im => {
|
|
52
|
-
@mem_infos = {} # mem => {
|
|
53
|
-
@dst_infos = {} # dst => {
|
|
54
|
-
@dns_infos = {} # dns => {
|
|
55
|
-
@rsv_infos = {} # rsv => {
|
|
56
|
-
@resolv_caches = {} # domain => [
|
|
57
|
-
@p2d_infos = {} # p2d => {
|
|
58
|
-
@p2_infos = {} # p2 => {
|
|
50
|
+
@proxy_infos = {} # proxy => {:addrinfo :im :paused_dsts :paused_p2s :rbuff :src_infos :wbuff}
|
|
51
|
+
@im_infos = {} # im => {:addrinfo :in :out :p2d :p2d_host :p2d_port :proxy}
|
|
52
|
+
@mem_infos = {} # mem => {:wbuff}
|
|
53
|
+
@dst_infos = {} # dst => {:closing :connected :domain :im :ip :overflowing :port :proxy :rbuffs :src_id :wbuff}
|
|
54
|
+
@dns_infos = {} # dns => {:domain :im :port :proxy :src_id}
|
|
55
|
+
@rsv_infos = {} # rsv => {:domain :im :near_id :proxy}
|
|
56
|
+
@resolv_caches = {} # domain => [ip, created_at, im]
|
|
57
|
+
@p2d_infos = {} # p2d => {:im}
|
|
58
|
+
@p2_infos = {} # p2 => {:addrinfo :closing :im :overflowing :p2_id :wbuff}
|
|
59
59
|
|
|
60
60
|
@head_len = head_len
|
|
61
61
|
@h_a_new_source = h_a_new_source
|
|
@@ -85,10 +85,10 @@ module Girl
|
|
|
85
85
|
@is_debug = is_debug
|
|
86
86
|
@is_server_fastopen = is_server_fastopen
|
|
87
87
|
|
|
88
|
-
init_im_infos(
|
|
89
|
-
new_a_proxyd(
|
|
90
|
-
new_a_infod(
|
|
91
|
-
new_a_memd(
|
|
88
|
+
init_im_infos(ims, p2d_host, p2d_port)
|
|
89
|
+
new_a_proxyd(proxyd_port)
|
|
90
|
+
new_a_infod(proxyd_port)
|
|
91
|
+
new_a_memd(memd_port)
|
|
92
92
|
end
|
|
93
93
|
|
|
94
94
|
def looping
|
|
@@ -97,51 +97,51 @@ module Girl
|
|
|
97
97
|
loop_check_traff
|
|
98
98
|
|
|
99
99
|
loop do
|
|
100
|
-
rs, ws = IO.select(
|
|
100
|
+
rs, ws = IO.select(@reads, @writes)
|
|
101
101
|
|
|
102
|
-
rs.each do |
|
|
103
|
-
role = @roles[
|
|
102
|
+
rs.each do |sock|
|
|
103
|
+
role = @roles[sock]
|
|
104
104
|
|
|
105
105
|
case role
|
|
106
|
-
when :dns
|
|
107
|
-
read_dns(
|
|
108
|
-
when :dst
|
|
109
|
-
read_dst(
|
|
110
|
-
when :infod
|
|
111
|
-
read_infod(
|
|
112
|
-
when :mem
|
|
113
|
-
read_mem(
|
|
114
|
-
when :memd
|
|
115
|
-
read_memd(
|
|
116
|
-
when :p2
|
|
117
|
-
read_p2(
|
|
118
|
-
when :p2d
|
|
119
|
-
read_p2d(
|
|
120
|
-
when :rsv
|
|
121
|
-
read_rsv(
|
|
122
|
-
when :proxy
|
|
123
|
-
read_proxy(
|
|
124
|
-
when :proxyd
|
|
125
|
-
read_proxyd(
|
|
106
|
+
when :dns
|
|
107
|
+
read_dns(sock)
|
|
108
|
+
when :dst
|
|
109
|
+
read_dst(sock)
|
|
110
|
+
when :infod
|
|
111
|
+
read_infod(sock)
|
|
112
|
+
when :mem
|
|
113
|
+
read_mem(sock)
|
|
114
|
+
when :memd
|
|
115
|
+
read_memd(sock)
|
|
116
|
+
when :p2
|
|
117
|
+
read_p2(sock)
|
|
118
|
+
when :p2d
|
|
119
|
+
read_p2d(sock)
|
|
120
|
+
when :rsv
|
|
121
|
+
read_rsv(sock)
|
|
122
|
+
when :proxy
|
|
123
|
+
read_proxy(sock)
|
|
124
|
+
when :proxyd
|
|
125
|
+
read_proxyd(sock)
|
|
126
126
|
else
|
|
127
|
-
close_sock(
|
|
127
|
+
close_sock(sock)
|
|
128
128
|
end
|
|
129
129
|
end
|
|
130
130
|
|
|
131
|
-
ws.each do |
|
|
132
|
-
role = @roles[
|
|
131
|
+
ws.each do |sock|
|
|
132
|
+
role = @roles[sock]
|
|
133
133
|
|
|
134
134
|
case role
|
|
135
|
-
when :dst
|
|
136
|
-
write_dst(
|
|
137
|
-
when :mem
|
|
138
|
-
write_mem(
|
|
139
|
-
when :p2
|
|
140
|
-
write_p2(
|
|
141
|
-
when :proxy
|
|
142
|
-
write_proxy(
|
|
135
|
+
when :dst
|
|
136
|
+
write_dst(sock)
|
|
137
|
+
when :mem
|
|
138
|
+
write_mem(sock)
|
|
139
|
+
when :p2
|
|
140
|
+
write_p2(sock)
|
|
141
|
+
when :proxy
|
|
142
|
+
write_proxy(sock)
|
|
143
143
|
else
|
|
144
|
-
close_sock(
|
|
144
|
+
close_sock(sock)
|
|
145
145
|
end
|
|
146
146
|
end
|
|
147
147
|
end
|
|
@@ -156,279 +156,276 @@ module Girl
|
|
|
156
156
|
|
|
157
157
|
private
|
|
158
158
|
|
|
159
|
-
def add_dst_wbuff(
|
|
159
|
+
def add_dst_wbuff(dst, data)
|
|
160
160
|
return if dst.nil? || dst.closed? || data.nil? || data.empty?
|
|
161
|
-
dst_info = @dst_infos[
|
|
162
|
-
dst_info[
|
|
163
|
-
bytesize = dst_info[
|
|
164
|
-
im = dst_info[
|
|
165
|
-
src_id = dst_info[
|
|
166
|
-
domain = dst_info[
|
|
167
|
-
|
|
168
|
-
if bytesize >= CLOSE_ABOVE
|
|
169
|
-
puts "close overflow dst #{
|
|
170
|
-
close_dst(
|
|
161
|
+
dst_info = @dst_infos[dst]
|
|
162
|
+
dst_info[:wbuff] << data
|
|
163
|
+
bytesize = dst_info[:wbuff].bytesize
|
|
164
|
+
im = dst_info[:im]
|
|
165
|
+
src_id = dst_info[:src_id]
|
|
166
|
+
domain = dst_info[:domain]
|
|
167
|
+
|
|
168
|
+
if bytesize >= CLOSE_ABOVE
|
|
169
|
+
puts "close overflow dst #{src_id} #{domain}"
|
|
170
|
+
close_dst(dst)
|
|
171
171
|
return
|
|
172
172
|
end
|
|
173
173
|
|
|
174
|
-
if !dst_info[
|
|
175
|
-
proxy = dst_info[
|
|
176
|
-
puts "add h_dst_overflow #{
|
|
177
|
-
msg = "#{
|
|
178
|
-
add_proxy_wbuff(
|
|
179
|
-
dst_info[
|
|
174
|
+
if !dst_info[:overflowing] && (bytesize >= WBUFF_LIMIT)
|
|
175
|
+
proxy = dst_info[:proxy]
|
|
176
|
+
puts "add h_dst_overflow #{im} #{src_id} #{domain}"
|
|
177
|
+
msg = "#{@h_dst_overflow}#{[src_id].pack('Q>')}"
|
|
178
|
+
add_proxy_wbuff(proxy, pack_a_chunk(msg))
|
|
179
|
+
dst_info[:overflowing] = true
|
|
180
180
|
end
|
|
181
181
|
|
|
182
|
-
add_write(
|
|
182
|
+
add_write(dst)
|
|
183
183
|
end
|
|
184
184
|
|
|
185
|
-
def add_mem_wbuff(
|
|
185
|
+
def add_mem_wbuff(mem, data)
|
|
186
186
|
return if mem.nil? || mem.closed? || data.nil? || data.empty?
|
|
187
|
-
mem_info = @mem_infos[
|
|
188
|
-
mem_info[
|
|
189
|
-
add_write(
|
|
187
|
+
mem_info = @mem_infos[mem]
|
|
188
|
+
mem_info[:wbuff] << data
|
|
189
|
+
add_write(mem)
|
|
190
190
|
end
|
|
191
191
|
|
|
192
|
-
def add_p2_wbuff(
|
|
192
|
+
def add_p2_wbuff(p2, data)
|
|
193
193
|
return if p2.nil? || p2.closed? || data.nil? || data.empty?
|
|
194
|
-
p2_info = @p2_infos[
|
|
195
|
-
im = p2_info[
|
|
196
|
-
im_info = @im_infos[
|
|
194
|
+
p2_info = @p2_infos[p2]
|
|
195
|
+
im = p2_info[:im]
|
|
196
|
+
im_info = @im_infos[im]
|
|
197
197
|
|
|
198
|
-
unless im_info
|
|
199
|
-
close_p2(
|
|
198
|
+
unless im_info
|
|
199
|
+
close_p2(p2)
|
|
200
200
|
return
|
|
201
201
|
end
|
|
202
202
|
|
|
203
|
-
p2_info[
|
|
204
|
-
bytesize = p2_info[
|
|
205
|
-
p2_id = p2_info[
|
|
203
|
+
p2_info[:wbuff] << data
|
|
204
|
+
bytesize = p2_info[:wbuff].bytesize
|
|
205
|
+
p2_id = p2_info[:p2_id]
|
|
206
206
|
|
|
207
|
-
if bytesize >= CLOSE_ABOVE
|
|
208
|
-
puts "close overflow p2 #{
|
|
209
|
-
close_p2(
|
|
207
|
+
if bytesize >= CLOSE_ABOVE
|
|
208
|
+
puts "close overflow p2 #{p2_id}"
|
|
209
|
+
close_p2(p2)
|
|
210
210
|
return
|
|
211
211
|
end
|
|
212
212
|
|
|
213
|
-
if !p2_info[
|
|
214
|
-
proxy = im_info[
|
|
215
|
-
puts "add h_p2_overflow #{
|
|
216
|
-
msg = "#{
|
|
217
|
-
add_proxy_wbuff(
|
|
218
|
-
p2_info[
|
|
213
|
+
if !p2_info[:overflowing] && (bytesize >= WBUFF_LIMIT)
|
|
214
|
+
proxy = im_info[:proxy]
|
|
215
|
+
puts "add h_p2_overflow #{im} #{p2_id}"
|
|
216
|
+
msg = "#{@h_p2_overflow}#{[p2_id].pack('Q>')}"
|
|
217
|
+
add_proxy_wbuff(proxy, pack_a_chunk(msg))
|
|
218
|
+
p2_info[:overflowing] = true
|
|
219
219
|
end
|
|
220
220
|
|
|
221
|
-
add_write(
|
|
221
|
+
add_write(p2)
|
|
222
222
|
end
|
|
223
223
|
|
|
224
|
-
def add_proxy_wbuff(
|
|
224
|
+
def add_proxy_wbuff(proxy, data)
|
|
225
225
|
return if proxy.nil? || proxy.closed? || data.nil? || data.empty?
|
|
226
|
-
proxy_info = @proxy_infos[
|
|
227
|
-
proxy_info[
|
|
228
|
-
bytesize = proxy_info[
|
|
226
|
+
proxy_info = @proxy_infos[proxy]
|
|
227
|
+
proxy_info[:wbuff] << data
|
|
228
|
+
bytesize = proxy_info[:wbuff].bytesize
|
|
229
229
|
|
|
230
|
-
if bytesize >= CLOSE_ABOVE
|
|
231
|
-
puts "close overflow proxy #{
|
|
232
|
-
close_proxy(
|
|
230
|
+
if bytesize >= CLOSE_ABOVE
|
|
231
|
+
puts "close overflow proxy #{proxy_info[:im]}"
|
|
232
|
+
close_proxy(proxy)
|
|
233
233
|
return
|
|
234
234
|
end
|
|
235
235
|
|
|
236
|
-
add_write(
|
|
236
|
+
add_write(proxy)
|
|
237
237
|
end
|
|
238
238
|
|
|
239
|
-
def add_read(
|
|
240
|
-
return if sock.nil? || sock.closed? || @reads.include?(
|
|
239
|
+
def add_read(sock, role = nil)
|
|
240
|
+
return if sock.nil? || sock.closed? || @reads.include?(sock)
|
|
241
241
|
@reads << sock
|
|
242
242
|
|
|
243
|
-
if role
|
|
244
|
-
@roles[
|
|
243
|
+
if role
|
|
244
|
+
@roles[sock] = role
|
|
245
245
|
else
|
|
246
|
-
role = @roles[
|
|
246
|
+
role = @roles[sock]
|
|
247
247
|
end
|
|
248
248
|
|
|
249
|
-
if @update_roles.include?(
|
|
250
|
-
set_update(
|
|
249
|
+
if @update_roles.include?(role)
|
|
250
|
+
set_update(sock)
|
|
251
251
|
end
|
|
252
252
|
end
|
|
253
253
|
|
|
254
|
-
def add_write(
|
|
255
|
-
return if sock.nil? || sock.closed? || @writes.include?(
|
|
254
|
+
def add_write(sock)
|
|
255
|
+
return if sock.nil? || sock.closed? || @writes.include?(sock)
|
|
256
256
|
@writes << sock
|
|
257
|
-
role = @roles[
|
|
258
|
-
|
|
259
|
-
if @update_roles.include?( role ) then
|
|
260
|
-
set_update( sock )
|
|
261
|
-
end
|
|
257
|
+
role = @roles[sock]
|
|
258
|
+
set_update(sock) if @update_roles.include?(role)
|
|
262
259
|
end
|
|
263
260
|
|
|
264
261
|
def check_expire_dnses
|
|
265
262
|
now = Time.new
|
|
266
263
|
|
|
267
|
-
@dns_infos.select{
|
|
268
|
-
puts "expire dns #{
|
|
269
|
-
close_dns(
|
|
264
|
+
@dns_infos.select{|dns, _| now.to_i - @updates[dns].to_i >= @expire_short_after}.each do |dns, info|
|
|
265
|
+
puts "expire dns #{info[:im]} #{info[:domain]}" if @is_debug
|
|
266
|
+
close_dns(dns)
|
|
270
267
|
end
|
|
271
268
|
end
|
|
272
269
|
|
|
273
270
|
def check_expire_dsts
|
|
274
271
|
now = Time.new
|
|
275
272
|
|
|
276
|
-
@dst_infos.select{
|
|
277
|
-
puts "expire dst #{
|
|
278
|
-
close_dst(
|
|
273
|
+
@dst_infos.select{|dst, info| info[:connected] ? (now.to_i - @updates[dst].to_i >= @expire_long_after) : (now.to_i - @updates[dst].to_i >= @expire_connecting)}.each do |dst, info|
|
|
274
|
+
puts "expire dst #{info[:im]} #{info[:domain]}" if @is_debug
|
|
275
|
+
close_dst(dst)
|
|
279
276
|
end
|
|
280
277
|
end
|
|
281
278
|
|
|
282
279
|
def check_expire_mems
|
|
283
280
|
now = Time.new
|
|
284
281
|
|
|
285
|
-
@mem_infos.select{
|
|
282
|
+
@mem_infos.select{|mem, _| now.to_i - @updates[mem].to_i >= @expire_short_after}.each do |mem, _|
|
|
286
283
|
puts "expire mem" if @is_debug
|
|
287
|
-
close_mem(
|
|
284
|
+
close_mem(mem)
|
|
288
285
|
end
|
|
289
286
|
end
|
|
290
287
|
|
|
291
288
|
def check_expire_p2s
|
|
292
289
|
now = Time.new
|
|
293
290
|
|
|
294
|
-
@p2_infos.select{
|
|
295
|
-
puts "expire p2 #{
|
|
296
|
-
close_p2(
|
|
291
|
+
@p2_infos.select{|p2, _| now.to_i - @updates[p2].to_i >= @expire_long_after}.each do |p2, info|
|
|
292
|
+
puts "expire p2 #{info[:im]} #{info[:p2_id]}" if @is_debug
|
|
293
|
+
close_p2(p2)
|
|
297
294
|
end
|
|
298
295
|
end
|
|
299
296
|
|
|
300
297
|
def check_expire_proxies
|
|
301
298
|
now = Time.new
|
|
302
299
|
|
|
303
|
-
@proxy_infos.select{
|
|
304
|
-
puts "expire proxy #{
|
|
305
|
-
close_proxy(
|
|
300
|
+
@proxy_infos.select{|proxy, _| now.to_i - @updates[proxy].to_i >= @expire_long_after}.each do |proxy, info|
|
|
301
|
+
puts "expire proxy #{info[:im]}"
|
|
302
|
+
close_proxy(proxy)
|
|
306
303
|
end
|
|
307
304
|
end
|
|
308
305
|
|
|
309
306
|
def check_expire_rsvs
|
|
310
307
|
now = Time.new
|
|
311
308
|
|
|
312
|
-
@rsv_infos.select{
|
|
313
|
-
puts "expire rsv #{
|
|
314
|
-
close_rsv(
|
|
309
|
+
@rsv_infos.select{|rsv, _| now.to_i - @updates[rsv].to_i >= @expire_short_after}.each do |rsv, info|
|
|
310
|
+
puts "expire rsv #{info[:im]} #{info[:domain]}" if @is_debug
|
|
311
|
+
close_rsv(rsv)
|
|
315
312
|
end
|
|
316
313
|
end
|
|
317
314
|
|
|
318
|
-
def check_expire_srcs(
|
|
315
|
+
def check_expire_srcs(proxy)
|
|
319
316
|
return if proxy.nil? || proxy.closed?
|
|
320
|
-
proxy_info = @proxy_infos[
|
|
321
|
-
im = proxy_info[
|
|
317
|
+
proxy_info = @proxy_infos[proxy]
|
|
318
|
+
im = proxy_info[:im]
|
|
322
319
|
now = Time.new
|
|
323
320
|
|
|
324
|
-
proxy_info[
|
|
325
|
-
puts "expire src info #{
|
|
326
|
-
proxy_info[
|
|
321
|
+
proxy_info[:src_infos].select{|_, info| info[:dst].nil? && (now.to_i - info[:created_at].to_i >= @expire_short_after)}.each do |src_id, _|
|
|
322
|
+
puts "expire src info #{im} #{src_id}" if @is_debug
|
|
323
|
+
proxy_info[:src_infos].delete(src_id)
|
|
327
324
|
end
|
|
328
325
|
end
|
|
329
326
|
|
|
330
|
-
def close_dns(
|
|
327
|
+
def close_dns(dns)
|
|
331
328
|
return nil if dns.nil? || dns.closed?
|
|
332
|
-
close_sock(
|
|
333
|
-
dns_info = @dns_infos.delete(
|
|
334
|
-
puts "close dns #{
|
|
329
|
+
close_sock(dns)
|
|
330
|
+
dns_info = @dns_infos.delete(dns)
|
|
331
|
+
puts "close dns #{dns_info[:im]} #{dns_info[:domain]}" if @is_debug
|
|
335
332
|
dns_info
|
|
336
333
|
end
|
|
337
334
|
|
|
338
|
-
def close_dst(
|
|
335
|
+
def close_dst(dst)
|
|
339
336
|
return nil if dst.nil? || dst.closed?
|
|
340
|
-
close_sock(
|
|
341
|
-
dst_info = @dst_infos.delete(
|
|
342
|
-
im = dst_info[
|
|
343
|
-
src_id = dst_info[
|
|
344
|
-
domain = dst_info[
|
|
345
|
-
puts "close dst #{
|
|
346
|
-
proxy = dst_info[
|
|
347
|
-
|
|
348
|
-
unless proxy.closed?
|
|
349
|
-
proxy_info = @proxy_infos[
|
|
350
|
-
proxy_info[
|
|
351
|
-
proxy_info[
|
|
352
|
-
puts "add h_dst_close #{
|
|
353
|
-
msg = "#{
|
|
354
|
-
add_proxy_wbuff(
|
|
337
|
+
close_sock(dst)
|
|
338
|
+
dst_info = @dst_infos.delete(dst)
|
|
339
|
+
im = dst_info[:im]
|
|
340
|
+
src_id = dst_info[:src_id]
|
|
341
|
+
domain = dst_info[:domain]
|
|
342
|
+
puts "close dst #{im} #{src_id} #{domain}" if @is_debug
|
|
343
|
+
proxy = dst_info[:proxy]
|
|
344
|
+
|
|
345
|
+
unless proxy.closed?
|
|
346
|
+
proxy_info = @proxy_infos[proxy]
|
|
347
|
+
proxy_info[:paused_dsts].delete(dst)
|
|
348
|
+
proxy_info[:src_infos].delete(src_id)
|
|
349
|
+
puts "add h_dst_close #{im} #{src_id}" if @is_debug
|
|
350
|
+
msg = "#{@h_dst_close}#{[src_id].pack('Q>')}"
|
|
351
|
+
add_proxy_wbuff(proxy, pack_a_chunk(msg))
|
|
355
352
|
end
|
|
356
353
|
|
|
357
354
|
dst_info
|
|
358
355
|
end
|
|
359
356
|
|
|
360
|
-
def close_mem(
|
|
357
|
+
def close_mem(mem)
|
|
361
358
|
return nil if mem.nil? || mem.closed?
|
|
362
|
-
close_sock(
|
|
363
|
-
@mem_infos.delete(
|
|
359
|
+
close_sock(mem)
|
|
360
|
+
@mem_infos.delete(mem)
|
|
364
361
|
end
|
|
365
362
|
|
|
366
|
-
def close_p2(
|
|
363
|
+
def close_p2(p2)
|
|
367
364
|
return nil if p2.nil? || p2.closed?
|
|
368
|
-
close_sock(
|
|
369
|
-
p2_info = @p2_infos.delete(
|
|
370
|
-
im = p2_info[
|
|
371
|
-
p2_id = p2_info[
|
|
372
|
-
puts "close p2 #{
|
|
373
|
-
im_info = @im_infos[
|
|
374
|
-
|
|
375
|
-
if im_info
|
|
376
|
-
proxy = im_info[
|
|
377
|
-
|
|
378
|
-
if proxy && !proxy.closed?
|
|
379
|
-
proxy_info = @proxy_infos[
|
|
380
|
-
proxy_info[
|
|
381
|
-
puts "add h_p2_close #{
|
|
382
|
-
msg = "#{
|
|
383
|
-
add_proxy_wbuff(
|
|
365
|
+
close_sock(p2)
|
|
366
|
+
p2_info = @p2_infos.delete(p2)
|
|
367
|
+
im = p2_info[:im]
|
|
368
|
+
p2_id = p2_info[:p2_id]
|
|
369
|
+
puts "close p2 #{im} #{p2_id}"
|
|
370
|
+
im_info = @im_infos[im]
|
|
371
|
+
|
|
372
|
+
if im_info
|
|
373
|
+
proxy = im_info[:proxy]
|
|
374
|
+
|
|
375
|
+
if proxy && !proxy.closed?
|
|
376
|
+
proxy_info = @proxy_infos[proxy]
|
|
377
|
+
proxy_info[:paused_p2s].delete(p2)
|
|
378
|
+
puts "add h_p2_close #{im} #{p2_id}"
|
|
379
|
+
msg = "#{@h_p2_close}#{[p2_id].pack('Q>')}"
|
|
380
|
+
add_proxy_wbuff(proxy, pack_a_chunk(msg))
|
|
384
381
|
end
|
|
385
382
|
end
|
|
386
383
|
|
|
387
384
|
p2_info
|
|
388
385
|
end
|
|
389
386
|
|
|
390
|
-
def close_proxy(
|
|
387
|
+
def close_proxy(proxy)
|
|
391
388
|
return nil if proxy.nil? || proxy.closed?
|
|
392
|
-
close_sock(
|
|
393
|
-
proxy_info = @proxy_infos.delete(
|
|
394
|
-
im = proxy_info[
|
|
395
|
-
puts "close proxy #{
|
|
396
|
-
@dst_infos.select{
|
|
397
|
-
@p2_infos.select{
|
|
389
|
+
close_sock(proxy)
|
|
390
|
+
proxy_info = @proxy_infos.delete(proxy)
|
|
391
|
+
im = proxy_info[:im]
|
|
392
|
+
puts "close proxy #{proxy_info[:addrinfo].ip_unpack.inspect} #{im}" if @is_debug
|
|
393
|
+
@dst_infos.select{|_, info| info[:proxy] == proxy}.each{|dst, _| close_dst(dst)}
|
|
394
|
+
@p2_infos.select{|_, info| info[:im] == im}.each{|p2, _| close_p2(p2)}
|
|
398
395
|
proxy_info
|
|
399
396
|
end
|
|
400
397
|
|
|
401
|
-
def close_rsv(
|
|
398
|
+
def close_rsv(rsv)
|
|
402
399
|
return nil if rsv.nil? || rsv.closed?
|
|
403
|
-
close_sock(
|
|
404
|
-
rsv_info = @rsv_infos.delete(
|
|
405
|
-
puts "close rsv #{
|
|
400
|
+
close_sock(rsv)
|
|
401
|
+
rsv_info = @rsv_infos.delete(rsv)
|
|
402
|
+
puts "close rsv #{rsv_info[:im]} #{rsv_info[:domain]}" if @is_debug
|
|
406
403
|
rsv_info
|
|
407
404
|
end
|
|
408
405
|
|
|
409
|
-
def close_sock(
|
|
406
|
+
def close_sock(sock)
|
|
410
407
|
return if sock.nil? || sock.closed?
|
|
411
408
|
sock.close
|
|
412
|
-
@reads.delete(
|
|
413
|
-
@writes.delete(
|
|
414
|
-
@updates.delete(
|
|
415
|
-
@roles.delete(
|
|
409
|
+
@reads.delete(sock)
|
|
410
|
+
@writes.delete(sock)
|
|
411
|
+
@updates.delete(sock)
|
|
412
|
+
@roles.delete(sock)
|
|
416
413
|
end
|
|
417
414
|
|
|
418
|
-
def deal_msg(
|
|
415
|
+
def deal_msg(data, proxy)
|
|
419
416
|
return if data.nil? || data.empty? || proxy.nil? || proxy.closed?
|
|
420
|
-
proxy_info = @proxy_infos[
|
|
421
|
-
im = proxy_info[
|
|
417
|
+
proxy_info = @proxy_infos[proxy]
|
|
418
|
+
im = proxy_info[:im]
|
|
422
419
|
return unless im
|
|
423
|
-
h = data[
|
|
420
|
+
h = data[0]
|
|
424
421
|
|
|
425
422
|
case h
|
|
426
|
-
when @h_a_new_source
|
|
423
|
+
when @h_a_new_source
|
|
427
424
|
return if data.bytesize < 9
|
|
428
|
-
check_expire_srcs(
|
|
429
|
-
src_id = data[
|
|
430
|
-
domain_port = data[
|
|
431
|
-
puts "got h_a_new_source #{
|
|
425
|
+
check_expire_srcs(proxy)
|
|
426
|
+
src_id = data[1, 8].unpack('Q>').first
|
|
427
|
+
domain_port = data[9..-1]
|
|
428
|
+
puts "got h_a_new_source #{im} #{src_id} #{domain_port.inspect}" if @is_debug
|
|
432
429
|
|
|
433
430
|
src_info = {
|
|
434
431
|
created_at: Time.new,
|
|
@@ -436,125 +433,125 @@ module Girl
|
|
|
436
433
|
rbuff: ''
|
|
437
434
|
}
|
|
438
435
|
|
|
439
|
-
proxy_info[
|
|
440
|
-
resolve_domain_port(
|
|
441
|
-
when @h_p1_close
|
|
436
|
+
proxy_info[:src_infos][src_id] = src_info
|
|
437
|
+
resolve_domain_port(domain_port, src_id, proxy, im)
|
|
438
|
+
when @h_p1_close
|
|
442
439
|
return if data.bytesize < 9
|
|
443
|
-
p2_id = data[
|
|
444
|
-
puts "got h_p1_close #{
|
|
445
|
-
p2, _ = @p2_infos.find{
|
|
446
|
-
set_p2_closing(
|
|
447
|
-
when @h_p2_traffic
|
|
440
|
+
p2_id = data[1, 8].unpack('Q>').first
|
|
441
|
+
puts "got h_p1_close #{im} #{p2_id}"
|
|
442
|
+
p2, _ = @p2_infos.find{|_, info| (info[:im] == im) && (info[:p2_id] == p2_id)}
|
|
443
|
+
set_p2_closing(p2)
|
|
444
|
+
when @h_p2_traffic
|
|
448
445
|
return if data.bytesize < 9
|
|
449
|
-
p2_id = data[
|
|
450
|
-
data = data[
|
|
451
|
-
# puts "got h_p2_traffic #{
|
|
452
|
-
p2, _ = @p2_infos.find{
|
|
453
|
-
add_p2_wbuff(
|
|
454
|
-
when @h_p1_overflow
|
|
446
|
+
p2_id = data[1, 8].unpack('Q>').first
|
|
447
|
+
data = data[9..-1]
|
|
448
|
+
# puts "got h_p2_traffic #{im} #{p2_id} #{data.bytesize}" if @is_debug
|
|
449
|
+
p2, _ = @p2_infos.find{|_, info| (info[:im] == im) && (info[:p2_id] == p2_id)}
|
|
450
|
+
add_p2_wbuff(p2, data)
|
|
451
|
+
when @h_p1_overflow
|
|
455
452
|
return if data.bytesize < 9
|
|
456
|
-
p2_id = data[
|
|
457
|
-
puts "got h_p1_overflow pause p2 #{
|
|
458
|
-
p2, _ = @p2_infos.find{
|
|
459
|
-
@reads.delete(
|
|
460
|
-
proxy_info[
|
|
461
|
-
when @h_p1_underhalf
|
|
453
|
+
p2_id = data[1, 8].unpack('Q>').first
|
|
454
|
+
puts "got h_p1_overflow pause p2 #{im} #{p2_id}"
|
|
455
|
+
p2, _ = @p2_infos.find{|_, info| (info[:im] == im) && (info[:p2_id] == p2_id)}
|
|
456
|
+
@reads.delete(p2)
|
|
457
|
+
proxy_info[:paused_p2s].delete(p2)
|
|
458
|
+
when @h_p1_underhalf
|
|
462
459
|
return if data.bytesize < 9
|
|
463
|
-
p2_id = data[
|
|
464
|
-
puts "got h_p1_underhalf #{
|
|
465
|
-
p2, _ = @p2_infos.find{
|
|
466
|
-
add_read(
|
|
467
|
-
when @h_query
|
|
460
|
+
p2_id = data[1, 8].unpack('Q>').first
|
|
461
|
+
puts "got h_p1_underhalf #{im} #{p2_id}"
|
|
462
|
+
p2, _ = @p2_infos.find{|_, info| (info[:im] == im) && (info[:p2_id] == p2_id)}
|
|
463
|
+
add_read(p2)
|
|
464
|
+
when @h_query
|
|
468
465
|
return if data.bytesize < 10
|
|
469
|
-
near_id, type = data[
|
|
470
|
-
return unless [
|
|
471
|
-
domain = data[
|
|
466
|
+
near_id, type = data[1, 9].unpack('Q>C')
|
|
467
|
+
return unless [1, 28].include?(type)
|
|
468
|
+
domain = data[10..-1]
|
|
472
469
|
return if domain.nil? || domain.empty?
|
|
473
|
-
puts "got h_query #{
|
|
474
|
-
new_a_rsv(
|
|
475
|
-
when @h_src_close
|
|
470
|
+
puts "got h_query #{im} #{near_id} #{type} #{domain.inspect}" if @is_debug
|
|
471
|
+
new_a_rsv(domain, near_id, type, proxy, im)
|
|
472
|
+
when @h_src_close
|
|
476
473
|
return if data.bytesize < 9
|
|
477
|
-
src_id = data[
|
|
478
|
-
puts "got h_src_close #{
|
|
479
|
-
src_info = proxy_info[
|
|
480
|
-
set_dst_closing(
|
|
481
|
-
when @h_traffic
|
|
474
|
+
src_id = data[1, 8].unpack('Q>').first
|
|
475
|
+
puts "got h_src_close #{im} #{src_id}" if @is_debug
|
|
476
|
+
src_info = proxy_info[:src_infos].delete(src_id)
|
|
477
|
+
set_dst_closing(src_info[:dst]) if src_info
|
|
478
|
+
when @h_traffic
|
|
482
479
|
return if data.bytesize < 9
|
|
483
|
-
src_id = data[
|
|
484
|
-
data = data[
|
|
485
|
-
# puts "got h_traffic #{
|
|
486
|
-
src_info = proxy_info[
|
|
480
|
+
src_id = data[1, 8].unpack('Q>').first
|
|
481
|
+
data = data[9..-1]
|
|
482
|
+
# puts "got h_traffic #{im} #{src_id} #{data.bytesize}" if @is_debug
|
|
483
|
+
src_info = proxy_info[:src_infos][src_id]
|
|
487
484
|
|
|
488
|
-
if src_info
|
|
489
|
-
dst = src_info[
|
|
485
|
+
if src_info
|
|
486
|
+
dst = src_info[:dst]
|
|
490
487
|
|
|
491
|
-
if dst
|
|
492
|
-
add_dst_wbuff(
|
|
488
|
+
if dst
|
|
489
|
+
add_dst_wbuff(dst, data)
|
|
493
490
|
else
|
|
494
|
-
puts "add src rbuff #{
|
|
495
|
-
src_info[
|
|
491
|
+
puts "add src rbuff #{im} #{data.bytesize}" if @is_debug
|
|
492
|
+
src_info[:rbuff] << data
|
|
496
493
|
|
|
497
|
-
if src_info[
|
|
494
|
+
if src_info[:rbuff].bytesize >= WBUFF_LIMIT
|
|
498
495
|
puts "src rbuff full"
|
|
499
|
-
close_proxy(
|
|
496
|
+
close_proxy(proxy)
|
|
500
497
|
end
|
|
501
498
|
end
|
|
502
499
|
end
|
|
503
|
-
when @h_src_overflow
|
|
500
|
+
when @h_src_overflow
|
|
504
501
|
return if data.bytesize < 9
|
|
505
|
-
src_id = data[
|
|
506
|
-
puts "got h_src_overflow pause dst #{
|
|
507
|
-
src_info = proxy_info[
|
|
502
|
+
src_id = data[1, 8].unpack('Q>').first
|
|
503
|
+
puts "got h_src_overflow pause dst #{im} #{src_id}"
|
|
504
|
+
src_info = proxy_info[:src_infos][src_id]
|
|
508
505
|
|
|
509
|
-
if src_info
|
|
510
|
-
dst = src_info[
|
|
511
|
-
@reads.delete(
|
|
506
|
+
if src_info
|
|
507
|
+
dst = src_info[:dst]
|
|
508
|
+
@reads.delete(dst)
|
|
512
509
|
# 远端收取目的地比传给近端快,近端收取远端又比传给客户端快(2g wifi),流量即在远端proxy堆积,又在近端src堆积
|
|
513
510
|
# 这种情况只等待近端src降半,等到降半消息才恢复读dst,忽略proxy降半
|
|
514
|
-
proxy_info[
|
|
511
|
+
proxy_info[:paused_dsts].delete(dst)
|
|
515
512
|
end
|
|
516
|
-
when @h_src_underhalf
|
|
513
|
+
when @h_src_underhalf
|
|
517
514
|
return if data.bytesize < 9
|
|
518
|
-
src_id = data[
|
|
519
|
-
puts "got h_src_underhalf #{
|
|
520
|
-
src_info = proxy_info[
|
|
521
|
-
add_read(
|
|
515
|
+
src_id = data[1, 8].unpack('Q>').first
|
|
516
|
+
puts "got h_src_underhalf #{im} #{src_id}"
|
|
517
|
+
src_info = proxy_info[:src_infos][src_id]
|
|
518
|
+
add_read(src_info[:dst]) if src_info
|
|
522
519
|
end
|
|
523
520
|
end
|
|
524
521
|
|
|
525
|
-
def decode_to_msgs(
|
|
522
|
+
def decode_to_msgs(data)
|
|
526
523
|
msgs = []
|
|
527
524
|
part = ''
|
|
528
525
|
|
|
529
526
|
loop do
|
|
530
|
-
if data.bytesize <= 2
|
|
527
|
+
if data.bytesize <= 2
|
|
531
528
|
part = data
|
|
532
529
|
break
|
|
533
530
|
end
|
|
534
531
|
|
|
535
|
-
len = data[
|
|
532
|
+
len = data[0, 2].unpack('n').first
|
|
536
533
|
|
|
537
|
-
if len == 0
|
|
534
|
+
if len == 0
|
|
538
535
|
puts "msg zero len?"
|
|
539
536
|
break
|
|
540
537
|
end
|
|
541
538
|
|
|
542
|
-
if data.bytesize < (
|
|
539
|
+
if data.bytesize < (2 + len)
|
|
543
540
|
part = data
|
|
544
541
|
break
|
|
545
542
|
end
|
|
546
543
|
|
|
547
|
-
msgs << data[
|
|
548
|
-
data = data[
|
|
544
|
+
msgs << data[2, len]
|
|
545
|
+
data = data[(2 + len)..-1]
|
|
549
546
|
break if data.empty?
|
|
550
547
|
end
|
|
551
548
|
|
|
552
|
-
[
|
|
549
|
+
[msgs, part]
|
|
553
550
|
end
|
|
554
551
|
|
|
555
|
-
def init_im_infos(
|
|
556
|
-
ims.sort.each_with_index do |
|
|
557
|
-
@im_infos[
|
|
552
|
+
def init_im_infos(ims, p2d_host, p2d_port)
|
|
553
|
+
ims.sort.each_with_index do |im, i|
|
|
554
|
+
@im_infos[im] = {
|
|
558
555
|
addrinfo: nil,
|
|
559
556
|
in: 0,
|
|
560
557
|
out: 0,
|
|
@@ -567,15 +564,15 @@ module Girl
|
|
|
567
564
|
end
|
|
568
565
|
|
|
569
566
|
def loop_check_traff
|
|
570
|
-
if @reset_traff_day > 0
|
|
567
|
+
if @reset_traff_day > 0
|
|
571
568
|
Thread.new do
|
|
572
569
|
loop do
|
|
573
570
|
sleep CHECK_TRAFF_INTERVAL
|
|
574
571
|
now = Time.new
|
|
575
572
|
|
|
576
|
-
if (
|
|
577
|
-
msg = {
|
|
578
|
-
send_data(
|
|
573
|
+
if (now.day == @reset_traff_day) && (now.hour == 0)
|
|
574
|
+
msg = {message_type: 'reset-traffic'}
|
|
575
|
+
send_data(@info, JSON.generate(msg), @infod_addr)
|
|
579
576
|
end
|
|
580
577
|
end
|
|
581
578
|
end
|
|
@@ -586,36 +583,36 @@ module Girl
|
|
|
586
583
|
Thread.new do
|
|
587
584
|
loop do
|
|
588
585
|
sleep HEARTBEAT_INTERVAL
|
|
589
|
-
msg = {
|
|
590
|
-
send_data(
|
|
586
|
+
msg = {message_type: 'heartbeat'}
|
|
587
|
+
send_data(@info, JSON.generate(msg), @infod_addr)
|
|
591
588
|
end
|
|
592
589
|
end
|
|
593
590
|
end
|
|
594
591
|
|
|
595
|
-
def new_a_dst(
|
|
592
|
+
def new_a_dst(domain, ip, port, src_id, proxy)
|
|
596
593
|
return if proxy.nil? || proxy.closed?
|
|
597
|
-
proxy_info = @proxy_infos[
|
|
598
|
-
im = proxy_info[
|
|
599
|
-
src_info = proxy_info[
|
|
594
|
+
proxy_info = @proxy_infos[proxy]
|
|
595
|
+
im = proxy_info[:im]
|
|
596
|
+
src_info = proxy_info[:src_infos][src_id]
|
|
600
597
|
return unless src_info
|
|
601
598
|
|
|
602
599
|
check_expire_dsts
|
|
603
600
|
|
|
604
601
|
begin
|
|
605
|
-
dst = Socket.new(
|
|
602
|
+
dst = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
|
|
606
603
|
rescue Exception => e
|
|
607
|
-
puts "new a dst #{
|
|
604
|
+
puts "new a dst #{e.class} #{im} #{domain}:#{port}"
|
|
608
605
|
return
|
|
609
606
|
end
|
|
610
607
|
|
|
611
|
-
dst.setsockopt(
|
|
608
|
+
dst.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
|
|
612
609
|
|
|
613
610
|
begin
|
|
614
|
-
destination_addr = Socket.sockaddr_in(
|
|
615
|
-
dst.connect_nonblock(
|
|
611
|
+
destination_addr = Socket.sockaddr_in(port, ip)
|
|
612
|
+
dst.connect_nonblock(destination_addr)
|
|
616
613
|
rescue IO::WaitWritable
|
|
617
614
|
rescue Exception => e
|
|
618
|
-
puts "connect destination #{
|
|
615
|
+
puts "connect destination #{e.class} #{im} #{domain}:#{port}"
|
|
619
616
|
dst.close
|
|
620
617
|
return
|
|
621
618
|
end
|
|
@@ -631,56 +628,56 @@ module Girl
|
|
|
631
628
|
proxy: proxy,
|
|
632
629
|
rbuffs: [],
|
|
633
630
|
src_id: src_id,
|
|
634
|
-
wbuff: src_info[
|
|
631
|
+
wbuff: src_info[:rbuff].dup
|
|
635
632
|
}
|
|
636
633
|
|
|
637
|
-
@dst_infos[
|
|
638
|
-
add_read(
|
|
639
|
-
add_write(
|
|
640
|
-
src_info[
|
|
634
|
+
@dst_infos[dst] = dst_info
|
|
635
|
+
add_read(dst, :dst)
|
|
636
|
+
add_write(dst)
|
|
637
|
+
src_info[:dst] = dst
|
|
641
638
|
end
|
|
642
639
|
|
|
643
|
-
def new_a_infod(
|
|
640
|
+
def new_a_infod(infod_port)
|
|
644
641
|
infod_host = '127.0.0.1'
|
|
645
|
-
infod_addr = Socket.sockaddr_in(
|
|
646
|
-
infod = Socket.new(
|
|
647
|
-
infod.setsockopt(
|
|
648
|
-
infod.bind(
|
|
649
|
-
puts "infod bind on #{
|
|
650
|
-
add_read(
|
|
651
|
-
info = Socket.new(
|
|
642
|
+
infod_addr = Socket.sockaddr_in(infod_port, infod_host)
|
|
643
|
+
infod = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM, 0)
|
|
644
|
+
infod.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEPORT, 1) if RUBY_PLATFORM.include?('linux')
|
|
645
|
+
infod.bind(infod_addr)
|
|
646
|
+
puts "infod bind on #{infod_host} #{infod_port}"
|
|
647
|
+
add_read(infod, :infod)
|
|
648
|
+
info = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM, 0)
|
|
652
649
|
@infod_addr = infod_addr
|
|
653
650
|
@infod = infod
|
|
654
651
|
@info = info
|
|
655
652
|
end
|
|
656
653
|
|
|
657
|
-
def new_a_memd(
|
|
654
|
+
def new_a_memd(memd_port)
|
|
658
655
|
memd_host = '127.0.0.1'
|
|
659
|
-
memd = Socket.new(
|
|
660
|
-
memd.setsockopt(
|
|
661
|
-
memd.setsockopt(
|
|
662
|
-
memd.setsockopt(
|
|
663
|
-
memd.bind(
|
|
664
|
-
memd.listen(
|
|
665
|
-
puts "memd listen on #{
|
|
666
|
-
add_read(
|
|
656
|
+
memd = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
|
|
657
|
+
memd.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
|
|
658
|
+
memd.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEPORT, 1) if RUBY_PLATFORM.include?('linux')
|
|
659
|
+
memd.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_FASTOPEN, 5) if @is_server_fastopen
|
|
660
|
+
memd.bind(Socket.sockaddr_in(memd_port, memd_host))
|
|
661
|
+
memd.listen(5)
|
|
662
|
+
puts "memd listen on #{memd_host} #{memd_port}"
|
|
663
|
+
add_read(memd, :memd)
|
|
667
664
|
end
|
|
668
665
|
|
|
669
|
-
def new_a_rsv(
|
|
666
|
+
def new_a_rsv(domain, near_id, type, proxy, im)
|
|
670
667
|
check_expire_rsvs
|
|
671
|
-
rsv = Socket.new(
|
|
668
|
+
rsv = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM, 0)
|
|
672
669
|
|
|
673
670
|
begin
|
|
674
|
-
data = pack_a_query(
|
|
671
|
+
data = pack_a_query(domain, type)
|
|
675
672
|
rescue Exception => e
|
|
676
|
-
puts "rsv pack a query #{
|
|
673
|
+
puts "rsv pack a query #{e.class} #{e.message} #{domain}" if @is_debug
|
|
677
674
|
return
|
|
678
675
|
end
|
|
679
676
|
|
|
680
677
|
begin
|
|
681
|
-
@nameserver_addrs.each{
|
|
678
|
+
@nameserver_addrs.each{|addr| rsv.sendmsg(data, 0, addr)}
|
|
682
679
|
rescue Exception => e
|
|
683
|
-
puts "rsv send data #{
|
|
680
|
+
puts "rsv send data #{e.class}"
|
|
684
681
|
rsv.close
|
|
685
682
|
return
|
|
686
683
|
end
|
|
@@ -692,197 +689,197 @@ module Girl
|
|
|
692
689
|
proxy: proxy
|
|
693
690
|
}
|
|
694
691
|
|
|
695
|
-
@rsv_infos[
|
|
696
|
-
add_read(
|
|
692
|
+
@rsv_infos[rsv] = rsv_info
|
|
693
|
+
add_read(rsv, :rsv)
|
|
697
694
|
end
|
|
698
695
|
|
|
699
|
-
def new_a_p2d(
|
|
696
|
+
def new_a_p2d(p2d_host, p2d_port, im, proxy)
|
|
700
697
|
begin
|
|
701
|
-
p2d = Socket.new(
|
|
702
|
-
p2d.setsockopt(
|
|
703
|
-
p2d.setsockopt(
|
|
704
|
-
p2d.setsockopt(
|
|
705
|
-
p2d.bind(
|
|
706
|
-
p2d.listen(
|
|
707
|
-
puts "p2d listen on #{
|
|
708
|
-
@p2d_infos[
|
|
709
|
-
add_read(
|
|
698
|
+
p2d = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
|
|
699
|
+
p2d.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
|
|
700
|
+
p2d.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEPORT, 1) if RUBY_PLATFORM.include?('linux')
|
|
701
|
+
p2d.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_FASTOPEN, 5) if @is_server_fastopen
|
|
702
|
+
p2d.bind(Socket.sockaddr_in(p2d_port, p2d_host))
|
|
703
|
+
p2d.listen(5)
|
|
704
|
+
puts "p2d listen on #{p2d_host} #{p2d_port} #{im}"
|
|
705
|
+
@p2d_infos[p2d] = {im: im}
|
|
706
|
+
add_read(p2d, :p2d)
|
|
710
707
|
rescue Exception => e
|
|
711
|
-
puts "new a p2d #{
|
|
708
|
+
puts "new a p2d #{e.class}"
|
|
712
709
|
end
|
|
713
710
|
|
|
714
711
|
p2d
|
|
715
712
|
end
|
|
716
713
|
|
|
717
|
-
def new_a_proxyd(
|
|
714
|
+
def new_a_proxyd(proxyd_port)
|
|
718
715
|
proxyd_host = '0.0.0.0'
|
|
719
|
-
proxyd = Socket.new(
|
|
720
|
-
proxyd.setsockopt(
|
|
721
|
-
proxyd.setsockopt(
|
|
722
|
-
proxyd.setsockopt(
|
|
723
|
-
proxyd.bind(
|
|
724
|
-
proxyd.listen(
|
|
725
|
-
puts "proxyd listen on #{
|
|
726
|
-
add_read(
|
|
716
|
+
proxyd = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
|
|
717
|
+
proxyd.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
|
|
718
|
+
proxyd.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEPORT, 1) if RUBY_PLATFORM.include?('linux')
|
|
719
|
+
proxyd.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_FASTOPEN, BACKLOG) if @is_server_fastopen
|
|
720
|
+
proxyd.bind(Socket.sockaddr_in(proxyd_port, proxyd_host))
|
|
721
|
+
proxyd.listen(BACKLOG)
|
|
722
|
+
puts "proxyd listen on #{proxyd_host} #{proxyd_port}"
|
|
723
|
+
add_read(proxyd, :proxyd)
|
|
727
724
|
end
|
|
728
725
|
|
|
729
|
-
def pack_a_chunk(
|
|
730
|
-
"#{
|
|
726
|
+
def pack_a_chunk(msg)
|
|
727
|
+
"#{[msg.bytesize].pack('n')}#{msg}"
|
|
731
728
|
end
|
|
732
729
|
|
|
733
|
-
def pack_p2_traffic(
|
|
730
|
+
def pack_p2_traffic(p2_id, data)
|
|
734
731
|
chunks = ''
|
|
735
732
|
|
|
736
733
|
loop do
|
|
737
|
-
part = data[
|
|
738
|
-
# puts "add h_p2_traffic #{
|
|
739
|
-
msg = "#{
|
|
740
|
-
chunks << pack_a_chunk(
|
|
741
|
-
data = data[
|
|
734
|
+
part = data[0, 65526]
|
|
735
|
+
# puts "add h_p2_traffic #{p2_id} #{part.bytesize}" if @is_debug
|
|
736
|
+
msg = "#{@h_p2_traffic}#{[p2_id].pack('Q>')}#{part}"
|
|
737
|
+
chunks << pack_a_chunk(msg)
|
|
738
|
+
data = data[part.bytesize..-1]
|
|
742
739
|
break if data.empty?
|
|
743
740
|
end
|
|
744
741
|
|
|
745
742
|
chunks
|
|
746
743
|
end
|
|
747
744
|
|
|
748
|
-
def pack_traffic(
|
|
745
|
+
def pack_traffic(src_id, data)
|
|
749
746
|
chunks = ''
|
|
750
747
|
|
|
751
748
|
loop do
|
|
752
|
-
part = data[
|
|
753
|
-
# puts "add h_traffic #{
|
|
754
|
-
msg = "#{
|
|
755
|
-
chunks << pack_a_chunk(
|
|
756
|
-
data = data[
|
|
749
|
+
part = data[0, 65526]
|
|
750
|
+
# puts "add h_traffic #{src_id} #{part.bytesize}" if @is_debug
|
|
751
|
+
msg = "#{@h_traffic}#{[src_id].pack('Q>')}#{part}"
|
|
752
|
+
chunks << pack_a_chunk(msg)
|
|
753
|
+
data = data[part.bytesize..-1]
|
|
757
754
|
break if data.empty?
|
|
758
755
|
end
|
|
759
756
|
|
|
760
757
|
chunks
|
|
761
758
|
end
|
|
762
759
|
|
|
763
|
-
def read_dns(
|
|
760
|
+
def read_dns(dns)
|
|
764
761
|
begin
|
|
765
762
|
data, addrinfo, rflags, *controls = dns.recvmsg
|
|
766
763
|
rescue Exception => e
|
|
767
|
-
puts "dns recvmsg #{
|
|
768
|
-
close_dns(
|
|
764
|
+
puts "dns recvmsg #{e.class}"
|
|
765
|
+
close_dns(dns)
|
|
769
766
|
return
|
|
770
767
|
end
|
|
771
768
|
|
|
772
769
|
return if data.empty?
|
|
773
770
|
|
|
774
771
|
begin
|
|
775
|
-
ip = seek_ip(
|
|
772
|
+
ip = seek_ip(data)
|
|
776
773
|
rescue Exception => e
|
|
777
|
-
puts "seek ip #{
|
|
778
|
-
close_dns(
|
|
774
|
+
puts "seek ip #{e.class} #{e.message}"
|
|
775
|
+
close_dns(dns)
|
|
779
776
|
return
|
|
780
777
|
end
|
|
781
778
|
|
|
782
|
-
dns_info = @dns_infos[
|
|
783
|
-
domain = dns_info[
|
|
779
|
+
dns_info = @dns_infos[dns]
|
|
780
|
+
domain = dns_info[:domain]
|
|
784
781
|
|
|
785
|
-
if ip
|
|
786
|
-
port = dns_info[
|
|
787
|
-
src_id = dns_info[
|
|
788
|
-
proxy = dns_info[
|
|
789
|
-
im = dns_info[
|
|
790
|
-
puts "got ip #{
|
|
791
|
-
new_a_dst(
|
|
792
|
-
@resolv_caches[
|
|
782
|
+
if ip
|
|
783
|
+
port = dns_info[:port]
|
|
784
|
+
src_id = dns_info[:src_id]
|
|
785
|
+
proxy = dns_info[:proxy]
|
|
786
|
+
im = dns_info[:im]
|
|
787
|
+
puts "got ip #{im} #{domain} #{ip}" if @is_debug
|
|
788
|
+
new_a_dst(domain, ip, port, src_id, proxy)
|
|
789
|
+
@resolv_caches[domain] = [ip, Time.new, im]
|
|
793
790
|
else
|
|
794
|
-
puts "no ip in answer #{
|
|
791
|
+
puts "no ip in answer #{domain}" if @is_debug
|
|
795
792
|
end
|
|
796
793
|
|
|
797
|
-
close_dns(
|
|
794
|
+
close_dns(dns)
|
|
798
795
|
end
|
|
799
796
|
|
|
800
|
-
def read_dst(
|
|
797
|
+
def read_dst(dst)
|
|
801
798
|
begin
|
|
802
|
-
data = dst.read_nonblock(
|
|
799
|
+
data = dst.read_nonblock(READ_SIZE)
|
|
803
800
|
rescue Errno::ENOTCONN => e
|
|
804
801
|
return
|
|
805
802
|
rescue Exception => e
|
|
806
|
-
close_dst(
|
|
803
|
+
close_dst(dst)
|
|
807
804
|
return
|
|
808
805
|
end
|
|
809
806
|
|
|
810
|
-
set_update(
|
|
811
|
-
dst_info = @dst_infos[
|
|
812
|
-
proxy = dst_info[
|
|
807
|
+
set_update(dst)
|
|
808
|
+
dst_info = @dst_infos[dst]
|
|
809
|
+
proxy = dst_info[:proxy]
|
|
813
810
|
|
|
814
|
-
if proxy.closed?
|
|
815
|
-
close_dst(
|
|
811
|
+
if proxy.closed?
|
|
812
|
+
close_dst(dst)
|
|
816
813
|
return
|
|
817
814
|
end
|
|
818
815
|
|
|
819
|
-
im = dst_info[
|
|
820
|
-
im_info = @im_infos[
|
|
821
|
-
im_info[
|
|
822
|
-
src_id = dst_info[
|
|
823
|
-
add_proxy_wbuff(
|
|
816
|
+
im = dst_info[:im]
|
|
817
|
+
im_info = @im_infos[im]
|
|
818
|
+
im_info[:in] += data.bytesize if im_info
|
|
819
|
+
src_id = dst_info[:src_id]
|
|
820
|
+
add_proxy_wbuff(proxy, pack_traffic(src_id, data))
|
|
824
821
|
|
|
825
|
-
unless proxy.closed?
|
|
826
|
-
proxy_info = @proxy_infos[
|
|
827
|
-
bytesize = proxy_info[
|
|
822
|
+
unless proxy.closed?
|
|
823
|
+
proxy_info = @proxy_infos[proxy]
|
|
824
|
+
bytesize = proxy_info[:wbuff].bytesize
|
|
828
825
|
|
|
829
|
-
if (
|
|
830
|
-
puts "proxy overflow pause dst #{
|
|
831
|
-
@reads.delete(
|
|
832
|
-
proxy_info[
|
|
826
|
+
if (bytesize >= WBUFF_LIMIT) && !proxy_info[:paused_dsts].include?(dst)
|
|
827
|
+
puts "proxy overflow pause dst #{im} #{src_id} #{dst_info[:domain]}"
|
|
828
|
+
@reads.delete(dst)
|
|
829
|
+
proxy_info[:paused_dsts] << dst
|
|
833
830
|
end
|
|
834
831
|
end
|
|
835
832
|
end
|
|
836
833
|
|
|
837
|
-
def read_infod(
|
|
834
|
+
def read_infod(infod)
|
|
838
835
|
begin
|
|
839
836
|
data, addrinfo, rflags, *controls = infod.recvmsg
|
|
840
837
|
rescue Exception => e
|
|
841
|
-
puts "infod recvmsg #{
|
|
838
|
+
puts "infod recvmsg #{e.class}"
|
|
842
839
|
return
|
|
843
840
|
end
|
|
844
841
|
|
|
845
842
|
return if data.empty?
|
|
846
843
|
|
|
847
844
|
begin
|
|
848
|
-
msg = JSON.parse(
|
|
845
|
+
msg = JSON.parse(data, symbolize_names: true)
|
|
849
846
|
rescue JSON::ParserError, EncodingError => e
|
|
850
|
-
puts "read infod #{
|
|
847
|
+
puts "read infod #{e.class}"
|
|
851
848
|
return
|
|
852
849
|
end
|
|
853
850
|
|
|
854
|
-
message_type = msg[
|
|
851
|
+
message_type = msg[:message_type]
|
|
855
852
|
|
|
856
853
|
case message_type
|
|
857
|
-
when 'heartbeat'
|
|
858
|
-
@proxy_infos.select{
|
|
859
|
-
when 'reset-traffic'
|
|
854
|
+
when 'heartbeat'
|
|
855
|
+
@proxy_infos.select{|_, info| info[:im]}.each{|proxy, _| add_proxy_wbuff(proxy, pack_a_chunk(@h_heartbeat))}
|
|
856
|
+
when 'reset-traffic'
|
|
860
857
|
puts "reset traffic"
|
|
861
|
-
@im_infos.each{
|
|
858
|
+
@im_infos.each{|_, info| info[:in] = info[:out] = 0}
|
|
862
859
|
end
|
|
863
860
|
end
|
|
864
861
|
|
|
865
|
-
def read_mem(
|
|
862
|
+
def read_mem(mem)
|
|
866
863
|
begin
|
|
867
|
-
mem.read_nonblock(
|
|
864
|
+
mem.read_nonblock(READ_SIZE)
|
|
868
865
|
rescue Errno::ENOTCONN => e
|
|
869
866
|
return
|
|
870
867
|
rescue Exception => e
|
|
871
|
-
close_mem(
|
|
868
|
+
close_mem(mem)
|
|
872
869
|
return
|
|
873
870
|
end
|
|
874
871
|
|
|
875
|
-
set_update(
|
|
872
|
+
set_update(mem)
|
|
876
873
|
im_arr = []
|
|
877
874
|
|
|
878
|
-
@im_infos.select{
|
|
875
|
+
@im_infos.select{|_, info| info[:addrinfo]}.sort.each do |im, info|
|
|
879
876
|
im_arr << {
|
|
880
877
|
im: im,
|
|
881
|
-
addrinfo: info[
|
|
882
|
-
in: info[
|
|
883
|
-
out: info[
|
|
884
|
-
p2d_host: info[
|
|
885
|
-
p2d_port: info[
|
|
878
|
+
addrinfo: info[:addrinfo].ip_unpack,
|
|
879
|
+
in: info[:in],
|
|
880
|
+
out: info[:out],
|
|
881
|
+
p2d_host: info[:p2d_host],
|
|
882
|
+
p2d_port: info[:p2d_port]
|
|
886
883
|
}
|
|
887
884
|
end
|
|
888
885
|
|
|
@@ -908,16 +905,16 @@ module Girl
|
|
|
908
905
|
im_arr: im_arr
|
|
909
906
|
}
|
|
910
907
|
|
|
911
|
-
add_mem_wbuff(
|
|
908
|
+
add_mem_wbuff(mem, JSON.generate(msg))
|
|
912
909
|
end
|
|
913
910
|
|
|
914
|
-
def read_memd(
|
|
911
|
+
def read_memd(memd)
|
|
915
912
|
check_expire_mems
|
|
916
913
|
|
|
917
914
|
begin
|
|
918
915
|
mem, addrinfo = memd.accept_nonblock
|
|
919
916
|
rescue Exception => e
|
|
920
|
-
puts "memd accept #{
|
|
917
|
+
puts "memd accept #{e.class}"
|
|
921
918
|
return
|
|
922
919
|
end
|
|
923
920
|
|
|
@@ -925,60 +922,60 @@ module Girl
|
|
|
925
922
|
wbuff: ''
|
|
926
923
|
}
|
|
927
924
|
|
|
928
|
-
@mem_infos[
|
|
929
|
-
add_read(
|
|
925
|
+
@mem_infos[mem] = mem_info
|
|
926
|
+
add_read(mem, :mem)
|
|
930
927
|
end
|
|
931
928
|
|
|
932
|
-
def read_p2(
|
|
929
|
+
def read_p2(p2)
|
|
933
930
|
begin
|
|
934
|
-
data = p2.read_nonblock(
|
|
931
|
+
data = p2.read_nonblock(READ_SIZE)
|
|
935
932
|
rescue Errno::ENOTCONN => e
|
|
936
933
|
return
|
|
937
934
|
rescue Exception => e
|
|
938
|
-
close_p2(
|
|
935
|
+
close_p2(p2)
|
|
939
936
|
return
|
|
940
937
|
end
|
|
941
938
|
|
|
942
|
-
set_update(
|
|
943
|
-
p2_info = @p2_infos[
|
|
944
|
-
im = p2_info[
|
|
945
|
-
# puts "read p2 #{
|
|
946
|
-
im_info = @im_infos[
|
|
939
|
+
set_update(p2)
|
|
940
|
+
p2_info = @p2_infos[p2]
|
|
941
|
+
im = p2_info[:im]
|
|
942
|
+
# puts "read p2 #{im} #{data.bytesize}" if @is_debug
|
|
943
|
+
im_info = @im_infos[im]
|
|
947
944
|
|
|
948
|
-
unless im_info
|
|
949
|
-
close_p2(
|
|
945
|
+
unless im_info
|
|
946
|
+
close_p2(p2)
|
|
950
947
|
return
|
|
951
948
|
end
|
|
952
949
|
|
|
953
|
-
proxy = im_info[
|
|
954
|
-
p2_id = p2_info[
|
|
955
|
-
add_proxy_wbuff(
|
|
950
|
+
proxy = im_info[:proxy]
|
|
951
|
+
p2_id = p2_info[:p2_id]
|
|
952
|
+
add_proxy_wbuff(proxy, pack_p2_traffic(p2_id, data))
|
|
956
953
|
|
|
957
|
-
unless proxy.closed?
|
|
958
|
-
proxy_info = @proxy_infos[
|
|
959
|
-
bytesize = proxy_info[
|
|
954
|
+
unless proxy.closed?
|
|
955
|
+
proxy_info = @proxy_infos[proxy]
|
|
956
|
+
bytesize = proxy_info[:wbuff].bytesize
|
|
960
957
|
|
|
961
|
-
if (
|
|
962
|
-
puts "proxy overflow pause p2 #{
|
|
963
|
-
@reads.delete(
|
|
964
|
-
proxy_info[
|
|
958
|
+
if (bytesize >= WBUFF_LIMIT) && !proxy_info[:paused_p2s].include?(p2)
|
|
959
|
+
puts "proxy overflow pause p2 #{im} #{p2_id}"
|
|
960
|
+
@reads.delete(p2)
|
|
961
|
+
proxy_info[:paused_p2s] << p2
|
|
965
962
|
end
|
|
966
963
|
end
|
|
967
964
|
end
|
|
968
965
|
|
|
969
|
-
def read_p2d(
|
|
966
|
+
def read_p2d(p2d)
|
|
970
967
|
check_expire_p2s
|
|
971
968
|
|
|
972
969
|
begin
|
|
973
970
|
p2, addrinfo = p2d.accept_nonblock
|
|
974
971
|
rescue Exception => e
|
|
975
|
-
puts "p2d accept #{
|
|
972
|
+
puts "p2d accept #{e.class}"
|
|
976
973
|
return
|
|
977
974
|
end
|
|
978
975
|
|
|
979
|
-
p2d_info = @p2d_infos[
|
|
980
|
-
im = p2d_info[
|
|
981
|
-
p2_id = rand(
|
|
976
|
+
p2d_info = @p2d_infos[p2d]
|
|
977
|
+
im = p2d_info[:im]
|
|
978
|
+
p2_id = rand((2 ** 64) - 2) + 1
|
|
982
979
|
|
|
983
980
|
p2_info = {
|
|
984
981
|
addrinfo: addrinfo,
|
|
@@ -989,114 +986,114 @@ module Girl
|
|
|
989
986
|
wbuff: ''
|
|
990
987
|
}
|
|
991
988
|
|
|
992
|
-
@p2_infos[
|
|
993
|
-
add_read(
|
|
994
|
-
im_info = @im_infos[
|
|
989
|
+
@p2_infos[p2] = p2_info
|
|
990
|
+
add_read(p2, :p2)
|
|
991
|
+
im_info = @im_infos[im]
|
|
995
992
|
return unless im_info
|
|
996
|
-
proxy = im_info[
|
|
997
|
-
puts "add h_a_new_p2 #{
|
|
998
|
-
msg = "#{
|
|
999
|
-
add_proxy_wbuff(
|
|
993
|
+
proxy = im_info[:proxy]
|
|
994
|
+
puts "add h_a_new_p2 #{im} #{p2_id}"
|
|
995
|
+
msg = "#{@h_a_new_p2}#{[p2_id].pack('Q>')}"
|
|
996
|
+
add_proxy_wbuff(proxy, pack_a_chunk(msg))
|
|
1000
997
|
end
|
|
1001
998
|
|
|
1002
|
-
def read_rsv(
|
|
999
|
+
def read_rsv(rsv)
|
|
1003
1000
|
begin
|
|
1004
1001
|
data, addrinfo, rflags, *controls = rsv.recvmsg
|
|
1005
1002
|
rescue Exception => e
|
|
1006
|
-
puts "rsv recvmsg #{
|
|
1007
|
-
close_rsv(
|
|
1003
|
+
puts "rsv recvmsg #{e.class}"
|
|
1004
|
+
close_rsv(rsv)
|
|
1008
1005
|
return
|
|
1009
1006
|
end
|
|
1010
1007
|
|
|
1011
1008
|
return if data.empty?
|
|
1012
1009
|
|
|
1013
|
-
if data.bytesize <= 65526
|
|
1014
|
-
rsv_info = @rsv_infos[
|
|
1015
|
-
proxy = rsv_info[
|
|
1016
|
-
near_id = rsv_info[
|
|
1017
|
-
puts "add h_response #{
|
|
1018
|
-
msg = "#{
|
|
1019
|
-
add_proxy_wbuff(
|
|
1010
|
+
if data.bytesize <= 65526
|
|
1011
|
+
rsv_info = @rsv_infos[rsv]
|
|
1012
|
+
proxy = rsv_info[:proxy]
|
|
1013
|
+
near_id = rsv_info[:near_id]
|
|
1014
|
+
puts "add h_response #{rsv_info[:im]} #{near_id} #{rsv_info[:domain]} #{data.bytesize}" if @is_debug
|
|
1015
|
+
msg = "#{@h_response}#{[near_id].pack('Q>')}#{data}"
|
|
1016
|
+
add_proxy_wbuff(proxy, pack_a_chunk(msg))
|
|
1020
1017
|
else
|
|
1021
|
-
puts "response too big? #{
|
|
1018
|
+
puts "response too big? #{data.bytesize}"
|
|
1022
1019
|
end
|
|
1023
1020
|
|
|
1024
|
-
close_rsv(
|
|
1021
|
+
close_rsv(rsv)
|
|
1025
1022
|
end
|
|
1026
1023
|
|
|
1027
|
-
def read_proxy(
|
|
1024
|
+
def read_proxy(proxy)
|
|
1028
1025
|
begin
|
|
1029
|
-
data = proxy.read_nonblock(
|
|
1026
|
+
data = proxy.read_nonblock(READ_SIZE)
|
|
1030
1027
|
rescue Errno::ENOTCONN => e
|
|
1031
1028
|
return
|
|
1032
1029
|
rescue Exception => e
|
|
1033
|
-
close_proxy(
|
|
1030
|
+
close_proxy(proxy)
|
|
1034
1031
|
return
|
|
1035
1032
|
end
|
|
1036
1033
|
|
|
1037
|
-
set_update(
|
|
1038
|
-
proxy_info = @proxy_infos[
|
|
1039
|
-
im = proxy_info[
|
|
1040
|
-
data = "#{
|
|
1034
|
+
set_update(proxy)
|
|
1035
|
+
proxy_info = @proxy_infos[proxy]
|
|
1036
|
+
im = proxy_info[:im]
|
|
1037
|
+
data = "#{proxy_info[:rbuff]}#{data}"
|
|
1041
1038
|
|
|
1042
|
-
unless im
|
|
1043
|
-
if data.bytesize < @head_len + 1
|
|
1044
|
-
proxy_info[
|
|
1039
|
+
unless im
|
|
1040
|
+
if data.bytesize < @head_len + 1
|
|
1041
|
+
proxy_info[:rbuff] = data
|
|
1045
1042
|
return
|
|
1046
1043
|
end
|
|
1047
1044
|
|
|
1048
|
-
len = data[
|
|
1045
|
+
len = data[@head_len].unpack('C').first
|
|
1049
1046
|
|
|
1050
|
-
if len == 0
|
|
1047
|
+
if len == 0
|
|
1051
1048
|
puts "im zero len?"
|
|
1052
1049
|
return
|
|
1053
1050
|
end
|
|
1054
1051
|
|
|
1055
|
-
if data.bytesize < @head_len + 1 + len
|
|
1056
|
-
proxy_info[
|
|
1052
|
+
if data.bytesize < @head_len + 1 + len
|
|
1053
|
+
proxy_info[:rbuff] = data
|
|
1057
1054
|
return
|
|
1058
1055
|
end
|
|
1059
1056
|
|
|
1060
|
-
im = data[
|
|
1057
|
+
im = data[@head_len + 1, len]
|
|
1061
1058
|
|
|
1062
|
-
if @im_infos.any? && !@im_infos.include?(
|
|
1063
|
-
puts "unknown im #{
|
|
1059
|
+
if @im_infos.any? && !@im_infos.include?(im)
|
|
1060
|
+
puts "unknown im #{im.inspect}"
|
|
1064
1061
|
return
|
|
1065
1062
|
end
|
|
1066
1063
|
|
|
1067
|
-
puts "got im #{
|
|
1068
|
-
proxy_info[
|
|
1069
|
-
im_info = @im_infos[
|
|
1064
|
+
puts "got im #{im}"
|
|
1065
|
+
proxy_info[:im] = im
|
|
1066
|
+
im_info = @im_infos[im]
|
|
1070
1067
|
|
|
1071
|
-
if im_info
|
|
1072
|
-
im_info[
|
|
1073
|
-
im_info[
|
|
1074
|
-
im_info[
|
|
1068
|
+
if im_info
|
|
1069
|
+
im_info[:proxy] = proxy
|
|
1070
|
+
im_info[:addrinfo] = proxy_info[:addrinfo]
|
|
1071
|
+
im_info[:p2d] = new_a_p2d(im_info[:p2d_host], im_info[:p2d_port], im, proxy) unless im_info[:p2d]
|
|
1075
1072
|
end
|
|
1076
1073
|
|
|
1077
|
-
add_proxy_wbuff(
|
|
1078
|
-
data = data[
|
|
1074
|
+
add_proxy_wbuff(proxy, pack_a_chunk(@h_heartbeat))
|
|
1075
|
+
data = data[(@head_len + 1 + len)..-1]
|
|
1079
1076
|
return if data.empty?
|
|
1080
1077
|
end
|
|
1081
1078
|
|
|
1082
|
-
im_info = @im_infos[
|
|
1083
|
-
im_info[
|
|
1084
|
-
msgs, part = decode_to_msgs(
|
|
1085
|
-
msgs.each{
|
|
1086
|
-
proxy_info[
|
|
1079
|
+
im_info = @im_infos[im]
|
|
1080
|
+
im_info[:in] += data.bytesize if im_info
|
|
1081
|
+
msgs, part = decode_to_msgs(data)
|
|
1082
|
+
msgs.each{|msg| deal_msg(msg, proxy)}
|
|
1083
|
+
proxy_info[:rbuff] = part
|
|
1087
1084
|
end
|
|
1088
1085
|
|
|
1089
|
-
def read_proxyd(
|
|
1086
|
+
def read_proxyd(proxyd)
|
|
1090
1087
|
check_expire_proxies
|
|
1091
1088
|
|
|
1092
1089
|
begin
|
|
1093
1090
|
proxy, addrinfo = proxyd.accept_nonblock
|
|
1094
1091
|
rescue Exception => e
|
|
1095
|
-
puts "accept a proxy #{
|
|
1092
|
+
puts "accept a proxy #{e.class}"
|
|
1096
1093
|
return
|
|
1097
1094
|
end
|
|
1098
1095
|
|
|
1099
|
-
puts "accept a proxy #{
|
|
1096
|
+
puts "accept a proxy #{addrinfo.ip_unpack.inspect}"
|
|
1100
1097
|
|
|
1101
1098
|
proxy_info = {
|
|
1102
1099
|
addrinfo: addrinfo,
|
|
@@ -1104,61 +1101,61 @@ module Girl
|
|
|
1104
1101
|
paused_dsts: [],
|
|
1105
1102
|
paused_p2s: [],
|
|
1106
1103
|
rbuff: '',
|
|
1107
|
-
src_infos: {}, # src_id => {
|
|
1104
|
+
src_infos: {}, # src_id => {:created_at :dst :rbuff}
|
|
1108
1105
|
wbuff: ''
|
|
1109
1106
|
}
|
|
1110
1107
|
|
|
1111
|
-
@proxy_infos[
|
|
1112
|
-
add_read(
|
|
1108
|
+
@proxy_infos[proxy] = proxy_info
|
|
1109
|
+
add_read(proxy, :proxy)
|
|
1113
1110
|
end
|
|
1114
1111
|
|
|
1115
|
-
def resolve_domain_port(
|
|
1112
|
+
def resolve_domain_port(domain_port, src_id, proxy, im)
|
|
1116
1113
|
return if domain_port.nil? || domain_port.empty?
|
|
1117
|
-
colon_idx = domain_port.rindex(
|
|
1114
|
+
colon_idx = domain_port.rindex(':')
|
|
1118
1115
|
return unless colon_idx
|
|
1119
1116
|
|
|
1120
|
-
domain = domain_port[
|
|
1121
|
-
port = domain_port[
|
|
1117
|
+
domain = domain_port[0...colon_idx]
|
|
1118
|
+
port = domain_port[(colon_idx + 1)..-1].to_i
|
|
1122
1119
|
|
|
1123
|
-
if (
|
|
1120
|
+
if (domain !~ /^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$/) || (domain =~ /^((0\.\d{1,3}\.\d{1,3}\.\d{1,3})|(10\.\d{1,3}\.\d{1,3}\.\d{1,3})|(127\.\d{1,3}\.\d{1,3}\.\d{1,3})|(169\.254\.\d{1,3}\.\d{1,3})|(172\.((1[6-9])|(2\d)|(3[01]))\.\d{1,3}\.\d{1,3})|(192\.168\.\d{1,3}\.\d{1,3})|(255\.255\.255\.255)|(localhost))$/)
|
|
1124
1121
|
# 忽略非法域名,内网地址
|
|
1125
|
-
puts "ignore #{
|
|
1122
|
+
puts "ignore #{domain}"
|
|
1126
1123
|
return
|
|
1127
1124
|
end
|
|
1128
1125
|
|
|
1129
|
-
if domain =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}$/
|
|
1126
|
+
if domain =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}$/
|
|
1130
1127
|
# ipv4
|
|
1131
|
-
new_a_dst(
|
|
1128
|
+
new_a_dst(domain, domain, port, src_id, proxy)
|
|
1132
1129
|
return
|
|
1133
1130
|
end
|
|
1134
1131
|
|
|
1135
|
-
resolv_cache = @resolv_caches[
|
|
1132
|
+
resolv_cache = @resolv_caches[domain]
|
|
1136
1133
|
|
|
1137
|
-
if resolv_cache
|
|
1134
|
+
if resolv_cache
|
|
1138
1135
|
ip, created_at, im = resolv_cache
|
|
1139
1136
|
|
|
1140
|
-
if Time.new - created_at < @expire_resolv_cache
|
|
1141
|
-
new_a_dst(
|
|
1137
|
+
if Time.new - created_at < @expire_resolv_cache
|
|
1138
|
+
new_a_dst(domain, ip, port, src_id, proxy)
|
|
1142
1139
|
return
|
|
1143
1140
|
end
|
|
1144
1141
|
|
|
1145
|
-
@resolv_caches.delete(
|
|
1142
|
+
@resolv_caches.delete(domain)
|
|
1146
1143
|
end
|
|
1147
1144
|
|
|
1148
1145
|
begin
|
|
1149
|
-
data = pack_a_query(
|
|
1146
|
+
data = pack_a_query(domain)
|
|
1150
1147
|
rescue Exception => e
|
|
1151
|
-
puts "dns pack a query #{
|
|
1148
|
+
puts "dns pack a query #{e.class} #{e.message} #{domain}" if @is_debug
|
|
1152
1149
|
return
|
|
1153
1150
|
end
|
|
1154
1151
|
|
|
1155
1152
|
check_expire_dnses
|
|
1156
|
-
dns = Socket.new(
|
|
1153
|
+
dns = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM, 0)
|
|
1157
1154
|
|
|
1158
1155
|
begin
|
|
1159
|
-
@nameserver_addrs.each{
|
|
1156
|
+
@nameserver_addrs.each{|addr| dns.sendmsg(data, 0, addr)}
|
|
1160
1157
|
rescue Exception => e
|
|
1161
|
-
puts "dns send data #{
|
|
1158
|
+
puts "dns send data #{e.class} #{domain}"
|
|
1162
1159
|
dns.close
|
|
1163
1160
|
return
|
|
1164
1161
|
end
|
|
@@ -1171,60 +1168,60 @@ module Girl
|
|
|
1171
1168
|
src_id: src_id
|
|
1172
1169
|
}
|
|
1173
1170
|
|
|
1174
|
-
@dns_infos[
|
|
1175
|
-
add_read(
|
|
1171
|
+
@dns_infos[dns] = dns_info
|
|
1172
|
+
add_read(dns, :dns)
|
|
1176
1173
|
end
|
|
1177
1174
|
|
|
1178
|
-
def send_data(
|
|
1175
|
+
def send_data(sock, data, target_addr)
|
|
1179
1176
|
begin
|
|
1180
|
-
sock.sendmsg(
|
|
1177
|
+
sock.sendmsg(data, 0, target_addr)
|
|
1181
1178
|
rescue Exception => e
|
|
1182
|
-
puts "sendmsg #{
|
|
1179
|
+
puts "sendmsg #{e.class}"
|
|
1183
1180
|
end
|
|
1184
1181
|
end
|
|
1185
1182
|
|
|
1186
|
-
def set_dst_closing(
|
|
1183
|
+
def set_dst_closing(dst)
|
|
1187
1184
|
return if dst.nil? || dst.closed?
|
|
1188
|
-
dst_info = @dst_infos[
|
|
1189
|
-
return if dst_info.nil? || dst_info[
|
|
1190
|
-
dst_info[
|
|
1191
|
-
add_write(
|
|
1185
|
+
dst_info = @dst_infos[dst]
|
|
1186
|
+
return if dst_info.nil? || dst_info[:closing]
|
|
1187
|
+
dst_info[:closing] = true
|
|
1188
|
+
add_write(dst)
|
|
1192
1189
|
end
|
|
1193
1190
|
|
|
1194
|
-
def set_p2_closing(
|
|
1191
|
+
def set_p2_closing(p2)
|
|
1195
1192
|
return if p2.nil? || p2.closed?
|
|
1196
|
-
p2_info = @p2_infos[
|
|
1197
|
-
return if p2_info.nil? || p2_info[
|
|
1198
|
-
p2_info[
|
|
1199
|
-
add_write(
|
|
1193
|
+
p2_info = @p2_infos[p2]
|
|
1194
|
+
return if p2_info.nil? || p2_info[:closing]
|
|
1195
|
+
p2_info[:closing] = true
|
|
1196
|
+
add_write(p2)
|
|
1200
1197
|
end
|
|
1201
1198
|
|
|
1202
|
-
def set_update(
|
|
1203
|
-
@updates[
|
|
1199
|
+
def set_update(sock)
|
|
1200
|
+
@updates[sock] = Time.new
|
|
1204
1201
|
|
|
1205
|
-
if @updates_limit - @updates.size <= 20
|
|
1206
|
-
puts "updates #{
|
|
1202
|
+
if @updates_limit - @updates.size <= 20
|
|
1203
|
+
puts "updates #{@updates.size}"
|
|
1207
1204
|
end
|
|
1208
1205
|
|
|
1209
|
-
if @updates.size >= @updates_limit
|
|
1206
|
+
if @updates.size >= @updates_limit
|
|
1210
1207
|
puts "eliminate updates"
|
|
1211
1208
|
|
|
1212
|
-
@updates.keys.each do |
|
|
1213
|
-
case @roles[
|
|
1209
|
+
@updates.keys.each do |_sock|
|
|
1210
|
+
case @roles[_sock]
|
|
1214
1211
|
when :dns
|
|
1215
|
-
close_dns(
|
|
1212
|
+
close_dns(_sock)
|
|
1216
1213
|
when :dst
|
|
1217
|
-
close_dst(
|
|
1214
|
+
close_dst(_sock)
|
|
1218
1215
|
when :mem
|
|
1219
|
-
close_mem(
|
|
1216
|
+
close_mem(_sock)
|
|
1220
1217
|
when :p2
|
|
1221
|
-
close_p2(
|
|
1218
|
+
close_p2(_sock)
|
|
1222
1219
|
when :proxy
|
|
1223
|
-
close_proxy(
|
|
1220
|
+
close_proxy(_sock)
|
|
1224
1221
|
when :rsv
|
|
1225
|
-
close_rsv(
|
|
1222
|
+
close_rsv(_sock)
|
|
1226
1223
|
else
|
|
1227
|
-
close_sock(
|
|
1224
|
+
close_sock(_sock)
|
|
1228
1225
|
end
|
|
1229
1226
|
end
|
|
1230
1227
|
|
|
@@ -1232,175 +1229,175 @@ module Girl
|
|
|
1232
1229
|
end
|
|
1233
1230
|
end
|
|
1234
1231
|
|
|
1235
|
-
def write_dst(
|
|
1236
|
-
if dst.closed?
|
|
1232
|
+
def write_dst(dst)
|
|
1233
|
+
if dst.closed?
|
|
1237
1234
|
puts "write closed dst?"
|
|
1238
1235
|
return
|
|
1239
1236
|
end
|
|
1240
1237
|
|
|
1241
|
-
dst_info = @dst_infos[
|
|
1242
|
-
dst_info[
|
|
1243
|
-
data = dst_info[
|
|
1238
|
+
dst_info = @dst_infos[dst]
|
|
1239
|
+
dst_info[:connected] = true
|
|
1240
|
+
data = dst_info[:wbuff]
|
|
1244
1241
|
|
|
1245
|
-
if data.empty?
|
|
1246
|
-
if dst_info[
|
|
1247
|
-
close_dst(
|
|
1242
|
+
if data.empty?
|
|
1243
|
+
if dst_info[:closing]
|
|
1244
|
+
close_dst(dst)
|
|
1248
1245
|
else
|
|
1249
|
-
@writes.delete(
|
|
1246
|
+
@writes.delete(dst)
|
|
1250
1247
|
end
|
|
1251
1248
|
|
|
1252
1249
|
return
|
|
1253
1250
|
end
|
|
1254
1251
|
|
|
1255
1252
|
begin
|
|
1256
|
-
written = dst.write_nonblock(
|
|
1253
|
+
written = dst.write_nonblock(data)
|
|
1257
1254
|
rescue Errno::EINPROGRESS
|
|
1258
1255
|
return
|
|
1259
1256
|
rescue Exception => e
|
|
1260
|
-
close_dst(
|
|
1257
|
+
close_dst(dst)
|
|
1261
1258
|
return
|
|
1262
1259
|
end
|
|
1263
1260
|
|
|
1264
|
-
set_update(
|
|
1265
|
-
im = dst_info[
|
|
1266
|
-
im_info = @im_infos[
|
|
1267
|
-
im_info[
|
|
1268
|
-
data = data[
|
|
1269
|
-
dst_info[
|
|
1270
|
-
bytesize = dst_info[
|
|
1261
|
+
set_update(dst)
|
|
1262
|
+
im = dst_info[:im]
|
|
1263
|
+
im_info = @im_infos[im]
|
|
1264
|
+
im_info[:out] += written if im_info
|
|
1265
|
+
data = data[written..-1]
|
|
1266
|
+
dst_info[:wbuff] = data
|
|
1267
|
+
bytesize = dst_info[:wbuff].bytesize
|
|
1271
1268
|
|
|
1272
|
-
if dst_info[
|
|
1273
|
-
proxy = dst_info[
|
|
1274
|
-
src_id = dst_info[
|
|
1275
|
-
puts "add h_dst_underhalf #{
|
|
1276
|
-
msg = "#{
|
|
1277
|
-
add_proxy_wbuff(
|
|
1278
|
-
dst_info[
|
|
1269
|
+
if dst_info[:overflowing] && (bytesize < RESUME_BELOW)
|
|
1270
|
+
proxy = dst_info[:proxy]
|
|
1271
|
+
src_id = dst_info[:src_id]
|
|
1272
|
+
puts "add h_dst_underhalf #{im} #{src_id} #{dst_info[:domain]}"
|
|
1273
|
+
msg = "#{@h_dst_underhalf}#{[src_id].pack('Q>')}"
|
|
1274
|
+
add_proxy_wbuff(proxy, pack_a_chunk(msg))
|
|
1275
|
+
dst_info[:overflowing] = false
|
|
1279
1276
|
end
|
|
1280
1277
|
end
|
|
1281
1278
|
|
|
1282
|
-
def write_mem(
|
|
1283
|
-
if mem.closed?
|
|
1279
|
+
def write_mem(mem)
|
|
1280
|
+
if mem.closed?
|
|
1284
1281
|
puts "write closed mem?"
|
|
1285
1282
|
return
|
|
1286
1283
|
end
|
|
1287
1284
|
|
|
1288
|
-
mem_info = @mem_infos[
|
|
1289
|
-
data = mem_info[
|
|
1285
|
+
mem_info = @mem_infos[mem]
|
|
1286
|
+
data = mem_info[:wbuff]
|
|
1290
1287
|
|
|
1291
|
-
if data.empty?
|
|
1292
|
-
@writes.delete(
|
|
1293
|
-
close_mem(
|
|
1288
|
+
if data.empty?
|
|
1289
|
+
@writes.delete(mem)
|
|
1290
|
+
close_mem(mem)
|
|
1294
1291
|
return
|
|
1295
1292
|
end
|
|
1296
1293
|
|
|
1297
1294
|
begin
|
|
1298
|
-
written = mem.write_nonblock(
|
|
1295
|
+
written = mem.write_nonblock(data)
|
|
1299
1296
|
rescue Errno::EINPROGRESS
|
|
1300
1297
|
return
|
|
1301
1298
|
rescue Exception => e
|
|
1302
|
-
close_mem(
|
|
1299
|
+
close_mem(mem)
|
|
1303
1300
|
return
|
|
1304
1301
|
end
|
|
1305
1302
|
|
|
1306
|
-
set_update(
|
|
1307
|
-
data = data[
|
|
1308
|
-
mem_info[
|
|
1303
|
+
set_update(mem)
|
|
1304
|
+
data = data[written..-1]
|
|
1305
|
+
mem_info[:wbuff] = data
|
|
1309
1306
|
end
|
|
1310
1307
|
|
|
1311
|
-
def write_p2(
|
|
1312
|
-
if p2.closed?
|
|
1308
|
+
def write_p2(p2)
|
|
1309
|
+
if p2.closed?
|
|
1313
1310
|
puts "write closed p2?"
|
|
1314
1311
|
return
|
|
1315
1312
|
end
|
|
1316
1313
|
|
|
1317
|
-
p2_info = @p2_infos[
|
|
1318
|
-
im = p2_info[
|
|
1319
|
-
im_info = @im_infos[
|
|
1314
|
+
p2_info = @p2_infos[p2]
|
|
1315
|
+
im = p2_info[:im]
|
|
1316
|
+
im_info = @im_infos[im]
|
|
1320
1317
|
|
|
1321
|
-
unless im_info
|
|
1322
|
-
close_p2(
|
|
1318
|
+
unless im_info
|
|
1319
|
+
close_p2(p2)
|
|
1323
1320
|
return
|
|
1324
1321
|
end
|
|
1325
1322
|
|
|
1326
|
-
data = p2_info[
|
|
1323
|
+
data = p2_info[:wbuff]
|
|
1327
1324
|
|
|
1328
|
-
if data.empty?
|
|
1329
|
-
if p2_info[
|
|
1330
|
-
close_p2(
|
|
1325
|
+
if data.empty?
|
|
1326
|
+
if p2_info[:closing]
|
|
1327
|
+
close_p2(p2)
|
|
1331
1328
|
else
|
|
1332
|
-
@writes.delete(
|
|
1329
|
+
@writes.delete(p2)
|
|
1333
1330
|
end
|
|
1334
1331
|
|
|
1335
1332
|
return
|
|
1336
1333
|
end
|
|
1337
1334
|
|
|
1338
1335
|
begin
|
|
1339
|
-
written = p2.write_nonblock(
|
|
1336
|
+
written = p2.write_nonblock(data)
|
|
1340
1337
|
rescue Errno::EINPROGRESS
|
|
1341
1338
|
return
|
|
1342
1339
|
rescue Exception => e
|
|
1343
|
-
close_p2(
|
|
1340
|
+
close_p2(p2)
|
|
1344
1341
|
return
|
|
1345
1342
|
end
|
|
1346
1343
|
|
|
1347
|
-
set_update(
|
|
1348
|
-
data = data[
|
|
1349
|
-
p2_info[
|
|
1350
|
-
bytesize = p2_info[
|
|
1344
|
+
set_update(p2)
|
|
1345
|
+
data = data[written..-1]
|
|
1346
|
+
p2_info[:wbuff] = data
|
|
1347
|
+
bytesize = p2_info[:wbuff].bytesize
|
|
1351
1348
|
|
|
1352
|
-
if p2_info[
|
|
1353
|
-
proxy = im_info[
|
|
1354
|
-
p2_id = p2_info[
|
|
1355
|
-
puts "add h_p2_underhalf #{
|
|
1356
|
-
msg = "#{
|
|
1357
|
-
add_proxy_wbuff(
|
|
1358
|
-
p2_info[
|
|
1349
|
+
if p2_info[:overflowing] && (bytesize < RESUME_BELOW)
|
|
1350
|
+
proxy = im_info[:proxy]
|
|
1351
|
+
p2_id = p2_info[:p2_id]
|
|
1352
|
+
puts "add h_p2_underhalf #{im} #{p2_id}"
|
|
1353
|
+
msg = "#{@h_p2_underhalf}#{[p2_id].pack('Q>')}"
|
|
1354
|
+
add_proxy_wbuff(proxy, pack_a_chunk(msg))
|
|
1355
|
+
p2_info[:overflowing] = false
|
|
1359
1356
|
end
|
|
1360
1357
|
end
|
|
1361
1358
|
|
|
1362
|
-
def write_proxy(
|
|
1363
|
-
if proxy.closed?
|
|
1359
|
+
def write_proxy(proxy)
|
|
1360
|
+
if proxy.closed?
|
|
1364
1361
|
puts "write closed proxy?"
|
|
1365
1362
|
return
|
|
1366
1363
|
end
|
|
1367
1364
|
|
|
1368
|
-
proxy_info = @proxy_infos[
|
|
1369
|
-
data = proxy_info[
|
|
1365
|
+
proxy_info = @proxy_infos[proxy]
|
|
1366
|
+
data = proxy_info[:wbuff]
|
|
1370
1367
|
|
|
1371
|
-
if data.empty?
|
|
1372
|
-
@writes.delete(
|
|
1368
|
+
if data.empty?
|
|
1369
|
+
@writes.delete(proxy)
|
|
1373
1370
|
return
|
|
1374
1371
|
end
|
|
1375
1372
|
|
|
1376
1373
|
begin
|
|
1377
|
-
written = proxy.write_nonblock(
|
|
1374
|
+
written = proxy.write_nonblock(data)
|
|
1378
1375
|
rescue Errno::EINPROGRESS
|
|
1379
1376
|
return
|
|
1380
1377
|
rescue Exception => e
|
|
1381
|
-
close_proxy(
|
|
1378
|
+
close_proxy(proxy)
|
|
1382
1379
|
return
|
|
1383
1380
|
end
|
|
1384
1381
|
|
|
1385
|
-
set_update(
|
|
1386
|
-
im = proxy_info[
|
|
1387
|
-
im_info = @im_infos[
|
|
1388
|
-
im_info[
|
|
1389
|
-
data = data[
|
|
1390
|
-
proxy_info[
|
|
1391
|
-
bytesize = proxy_info[
|
|
1382
|
+
set_update(proxy)
|
|
1383
|
+
im = proxy_info[:im]
|
|
1384
|
+
im_info = @im_infos[im]
|
|
1385
|
+
im_info[:out] += written if im_info
|
|
1386
|
+
data = data[written..-1]
|
|
1387
|
+
proxy_info[:wbuff] = data
|
|
1388
|
+
bytesize = proxy_info[:wbuff].bytesize
|
|
1392
1389
|
|
|
1393
|
-
if bytesize < RESUME_BELOW
|
|
1394
|
-
if proxy_info[
|
|
1395
|
-
puts "proxy underhalf resume dsts #{
|
|
1396
|
-
proxy_info[
|
|
1397
|
-
proxy_info[
|
|
1390
|
+
if bytesize < RESUME_BELOW
|
|
1391
|
+
if proxy_info[:paused_dsts].any?
|
|
1392
|
+
puts "proxy underhalf resume dsts #{im} #{proxy_info[:paused_dsts].size}"
|
|
1393
|
+
proxy_info[:paused_dsts].each{|dst| add_read(dst)}
|
|
1394
|
+
proxy_info[:paused_dsts].clear
|
|
1398
1395
|
end
|
|
1399
1396
|
|
|
1400
|
-
if proxy_info[
|
|
1401
|
-
puts "proxy underhalf resume p2s #{
|
|
1402
|
-
proxy_info[
|
|
1403
|
-
proxy_info[
|
|
1397
|
+
if proxy_info[:paused_p2s].any?
|
|
1398
|
+
puts "proxy underhalf resume p2s #{im} #{proxy_info[:paused_p2s].size}"
|
|
1399
|
+
proxy_info[:paused_p2s].each{|p2| add_read(p2)}
|
|
1400
|
+
proxy_info[:paused_p2s].clear
|
|
1404
1401
|
end
|
|
1405
1402
|
end
|
|
1406
1403
|
end
|