girl 0.93.0 → 0.94.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of girl might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: db00d3852751d26d014f0db01a04a8a3c4d7a43681003dc7b5a61b5af3f42db7
4
- data.tar.gz: 1938878b1125a8868aa1415a3c9200cf9003dc4310665ebcd7d51aba5871358a
3
+ metadata.gz: e4fbf6e091f1c0c19865e86a349ed046284ca1f807a171cd8f91b19066de3e28
4
+ data.tar.gz: cb9077f3870ba5cfc2ed17bf66f9c97767d94d882836acf757d5b6addcc4860a
5
5
  SHA512:
6
- metadata.gz: 6764a6e73718d396b02bac36d0d078741a659cfa1a32de13ef41183b4ed67b98be92e60a4d284abbdc3ee7ce929e872860f9aa7eab7caf715c3371c858eb6553
7
- data.tar.gz: 1945f2f6bc976654fe9542df2c8145ab983aa16ebdad0100a8893948a4cf076bf7e4851813fbfd459b78601c66bfd1e5fe120d29808b329e1558375509fe4e9c
6
+ metadata.gz: 4bcb135b88eb5fd4d06f7b7cbeb063553a380efa8c3359c0420b69c2b5481a873ea5632333c8dd56899112d86fb1a11697fa8befc734a168cb2d03ef9eb5b2b2
7
+ data.tar.gz: '07935ef257d9301b18a9e1b4ed943ac0499ca4b502434b27aebebcfb8fcbe3f7a576fc9e5e7a16e9ed37ab9cf75eb490b1802dcad7024dd33f7db1a32ae11d37'
@@ -5,6 +5,8 @@ module Girl
5
5
  SEND_HELLO_COUNT = 10 # hello/a new source最多发几次
6
6
  SEND_HELLO_INTERVAL = 0.5 # 发送hello/a new source间隔
7
7
  EXPIRE_AFTER = 300 # 多久没有新流量,过期
8
+ RESET_TRAFF_DAY = 1 # 流量计数重置日,0为不重置
9
+ CHECK_TRAFF_INTERVAL = 86400 # 检查今天是否是流量计数重置日间隔
8
10
  CHECK_EXPIRE_INTERVAL = 30 # 检查过期间隔
9
11
  CHECK_RESUME_INTERVAL = 1 # 检查恢复读间隔
10
12
  RESOLV_CACHE_EXPIRE = 300 # dns查询结果缓存多久过期
@@ -27,6 +29,7 @@ module Girl
27
29
  CONTINUE = 17
28
30
  IS_RESEND_READY = 18
29
31
  RESEND_READY = 19
32
+ TRAFF_INFOS = 101
30
33
  HTTP_OK = "HTTP/1.1 200 OK\r\n\r\n"
31
34
  # https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
32
35
  RESERVED_ROUTE = <<EOF
@@ -20,21 +20,34 @@ proxyd-tun:
20
20
 
21
21
  Q>: 0 ctlmsg -> C: 1 tund port -> n: tund port -> n: tcpd port
22
22
 
23
+ local-infod:
24
+
25
+ C: 101 traff infos
26
+
27
+ infod-local:
28
+
29
+ C: 101 traff infos -> [ C: im len -> im -> Q>: traff in -> Q>: traff out ]
30
+
23
31
  tun-tund:
24
32
 
25
33
  Q>: 0 ctlmsg -> C: 2 heartbeat
26
34
  3 a new source -> Q>: src id -> encoded destination address
27
35
  4 paired -> Q>: src id -> n: dst id
28
- 5 dest status [not use]
29
- 6 source status [not use]
30
- 7 miss [not use]
31
- 8 fin1 [not use]
32
- 9 confirm fin1 [not use]
33
- 10 fin2 [not use]
34
- 11 confirm fin2 [not use]
36
+ 5 dest status NOT USE
37
+ 6 source status NOT USE
38
+ 7 miss NOT USE
39
+ 8 fin1 NOT USE
40
+ 9 confirm fin1 NOT USE
41
+ 10 fin2 NOT USE
42
+ 11 confirm fin2 NOT USE
35
43
  12 tund fin
36
44
  13 tun fin
37
45
  14 tun ip changed
46
+ 15 single miss NOT USE
47
+ 16 range miss NOT USE
48
+ 17 continue NOT USE
49
+ 18 is resend ready NOT USE
50
+ 19 resend ready NOT USE
38
51
  =end
39
52
 
40
53
  module Girl
@@ -109,6 +122,10 @@ module Girl
109
122
  puts "im #{ im }"
110
123
  puts "worker count #{ worker_count }"
111
124
 
125
+ Girl::Custom.constants.each do | name |
126
+ puts "#{ name } #{ Girl::Custom.const_get( name ).inspect }"
127
+ end
128
+
112
129
  len = CONSTS.map{ | name | name.size }.max
113
130
 
114
131
  CONSTS.each do | name |
@@ -188,7 +188,10 @@ module Girl
188
188
  def close_dst( dst )
189
189
  # puts "debug1 close dst"
190
190
  close_sock( dst )
191
- @dst_infos.delete( dst )
191
+ dst_info = @dst_infos.delete( dst )
192
+ src = dst_info[ :src ]
193
+ close_read_src( src )
194
+ set_src_closing_write( src )
192
195
  end
193
196
 
194
197
  ##
@@ -258,7 +261,32 @@ module Girl
258
261
  def close_src( src )
259
262
  # puts "debug1 close src"
260
263
  close_sock( src )
261
- del_src_info( src )
264
+ src_info = del_src_info( src )
265
+ dst = src_info[ :dst ]
266
+
267
+ if dst then
268
+ close_read_dst( dst )
269
+ set_dst_closing_write( dst )
270
+ else
271
+ stream = src_info[ :stream ]
272
+
273
+ if stream then
274
+ close_read_stream( stream )
275
+ set_stream_closing_write( stream )
276
+ end
277
+ end
278
+ end
279
+
280
+ ##
281
+ # close stream
282
+ #
283
+ def close_stream( stream )
284
+ # puts "debug1 close stream"
285
+ close_sock( stream )
286
+ stream_info = @stream_infos.delete( stream )
287
+ src = stream_info[ :src ]
288
+ close_read_src( src )
289
+ set_src_closing_write( src )
262
290
  end
263
291
 
264
292
  ##
@@ -287,6 +315,7 @@ module Girl
287
315
  src_info = @src_infos[ src ]
288
316
  end
289
317
 
318
+ src_info[ :closed_write ] = true
290
319
  src_info
291
320
  end
292
321
 
@@ -307,6 +336,7 @@ module Girl
307
336
  dst_info = @dst_infos[ dst ]
308
337
  end
309
338
 
339
+ dst_info[ :closed_write ] = true
310
340
  dst_info
311
341
  end
312
342
 
@@ -327,6 +357,7 @@ module Girl
327
357
  stream_info = @stream_infos[ stream ]
328
358
  end
329
359
 
360
+ stream_info[ :closed_write ] = true
330
361
  stream_info
331
362
  end
332
363
 
@@ -531,7 +562,8 @@ module Girl
531
562
  wbuff: '', # 写前,从src读到的流量
532
563
  paused: false, # 是否已暂停读
533
564
  closing: false, # 准备关闭
534
- closing_write: false # 准备关闭写
565
+ closing_write: false, # 准备关闭写
566
+ closed_write: false # 已关闭写
535
567
  }
536
568
 
537
569
  @dst_infos[ dst ] = dst_info
@@ -590,10 +622,13 @@ module Girl
590
622
 
591
623
  domain = src_info[ :destination_domain ]
592
624
  @stream_infos[ stream ] = {
593
- src: src, # 对应src
594
- domain: domain, # 目的地
595
- wbuff: data, # 写前,写往远端streamd
596
- paused: false # 是否已暂停读
625
+ src: src, # 对应src
626
+ domain: domain, # 目的地
627
+ wbuff: data, # 写前,写往远端streamd
628
+ paused: false, # 是否已暂停读
629
+ closing: false, # 准备关闭
630
+ closing_write: false, # 准备关闭写
631
+ closed_write: false # 已关闭写
597
632
  }
598
633
 
599
634
  src_info[ :dst_id ] = dst_id
@@ -750,9 +785,14 @@ module Girl
750
785
  def set_dst_closing( dst )
751
786
  return if dst.closed?
752
787
  dst_info = @dst_infos[ dst ]
753
- dst_info[ :closing ] = true
754
- @reads.delete( dst )
755
- add_write( dst )
788
+
789
+ if dst_info[ :closed_write ] then
790
+ close_read_dst( dst )
791
+ else
792
+ dst_info[ :closing ] = true
793
+ @reads.delete( dst )
794
+ add_write( dst )
795
+ end
756
796
  end
757
797
 
758
798
  ##
@@ -760,7 +800,10 @@ module Girl
760
800
  #
761
801
  def set_dst_closing_write( dst )
762
802
  return if dst.closed?
803
+
763
804
  dst_info = @dst_infos[ dst ]
805
+ return if dst_info[ :closed_write ]
806
+
764
807
  dst_info[ :closing_write ] = true
765
808
  add_write( dst )
766
809
  end
@@ -770,10 +813,16 @@ module Girl
770
813
  #
771
814
  def set_src_closing( src )
772
815
  return if src.closed?
773
- @reads.delete( src )
816
+
774
817
  src_info = @src_infos[ src ]
775
- src_info[ :closing ] = true
776
- add_write( src )
818
+
819
+ if src_info[ :closed_write ] then
820
+ close_read_src( src )
821
+ else
822
+ @reads.delete( src )
823
+ src_info[ :closing ] = true
824
+ add_write( src )
825
+ end
777
826
  end
778
827
 
779
828
  ##
@@ -781,7 +830,10 @@ module Girl
781
830
  #
782
831
  def set_src_closing_write( src )
783
832
  return if src.closed?
833
+
784
834
  src_info = @src_infos[ src ]
835
+ return if src_info[ :closed_write ]
836
+
785
837
  src_info[ :closing_write ] = true
786
838
  add_write( src )
787
839
  end
@@ -806,23 +858,15 @@ module Girl
806
858
  end
807
859
  end
808
860
 
809
- ##
810
- # set stream closing
811
- #
812
- def set_stream_closing( stream )
813
- return if stream.closed?
814
- stream_info = @stream_infos[ stream ]
815
- stream_info[ :closing ] = true
816
- @reads.delete( stream )
817
- add_write( stream )
818
- end
819
-
820
861
  ##
821
862
  # set stream closing write
822
863
  #
823
864
  def set_stream_closing_write( stream )
824
865
  return if stream.closed?
866
+
825
867
  stream_info = @stream_infos[ stream ]
868
+ return if stream_info[ :closed_write ]
869
+
826
870
  stream_info[ :closing_write ] = true
827
871
  add_write( stream )
828
872
  end
@@ -894,7 +938,8 @@ module Girl
894
938
  last_sent_at: nil, # 上一次发出流量(由dst发出,或者由stream发出)的时间
895
939
  paused: false, # 是否已暂停读
896
940
  closing: false, # 准备关闭
897
- closing_write: false # 准备关闭写
941
+ closing_write: false, # 准备关闭写
942
+ closed_write: false # 已关闭写
898
943
  }
899
944
 
900
945
  add_read( src, :src )
@@ -961,6 +1006,8 @@ module Girl
961
1006
  # read src
962
1007
  #
963
1008
  def read_src( src )
1009
+ return if src.closed?
1010
+
964
1011
  begin
965
1012
  data = src.read_nonblock( READ_SIZE )
966
1013
  rescue IO::WaitReadable, Errno::EINTR
@@ -1164,6 +1211,8 @@ module Girl
1164
1211
  # read dst
1165
1212
  #
1166
1213
  def read_dst( dst )
1214
+ return if dst.closed?
1215
+
1167
1216
  begin
1168
1217
  data = dst.read_nonblock( READ_SIZE )
1169
1218
  rescue IO::WaitReadable, Errno::EINTR
@@ -1186,6 +1235,8 @@ module Girl
1186
1235
  # read stream
1187
1236
  #
1188
1237
  def read_stream( stream )
1238
+ return if stream.closed?
1239
+
1189
1240
  begin
1190
1241
  data = stream.read_nonblock( READ_SIZE )
1191
1242
  rescue IO::WaitReadable, Errno::EINTR
@@ -1250,19 +1301,6 @@ module Girl
1250
1301
  # 处理关闭
1251
1302
  if src_info[ :closing ] then
1252
1303
  close_src( src )
1253
-
1254
- if dst then
1255
- close_read_dst( dst )
1256
- set_dst_closing_write( dst )
1257
- else
1258
- stream = src_info[ :stream ]
1259
-
1260
- if stream then
1261
- close_read_stream( stream )
1262
- set_stream_closing_write( stream )
1263
- end
1264
- end
1265
-
1266
1304
  return
1267
1305
  end
1268
1306
 
@@ -1316,12 +1354,6 @@ module Girl
1316
1354
  # 处理关闭
1317
1355
  if dst_info[ :closing ] then
1318
1356
  close_dst( dst )
1319
-
1320
- if src then
1321
- close_read_src( src )
1322
- set_src_closing_write( src )
1323
- end
1324
-
1325
1357
  return
1326
1358
  end
1327
1359
 
@@ -1371,8 +1403,6 @@ module Girl
1371
1403
  # 处理关闭
1372
1404
  if stream_info[ :closing ] then
1373
1405
  close_stream( stream )
1374
- close_read_src( src )
1375
- set_src_closing_write( src )
1376
1406
  return
1377
1407
  end
1378
1408
 
@@ -17,6 +17,7 @@ module Girl
17
17
  raise "not found config file #{ config_path }" unless File.exist?( config_path )
18
18
  conf = JSON.parse( IO.binread( config_path ), symbolize_names: true )
19
19
  proxyd_port = conf[ :proxyd_port ]
20
+ infod_port = conf[ :infod_port ]
20
21
  worker_count = conf[ :worker_count ]
21
22
  end
22
23
 
@@ -24,6 +25,10 @@ module Girl
24
25
  proxyd_port = 6060
25
26
  end
26
27
 
28
+ unless infod_port then
29
+ infod_port = 6070
30
+ end
31
+
27
32
  nprocessors = Etc.nprocessors
28
33
 
29
34
  if worker_count.nil? || worker_count <= 0 || worker_count > nprocessors then
@@ -33,8 +38,13 @@ module Girl
33
38
  title = "girl proxyd #{ Girl::VERSION }"
34
39
  puts title
35
40
  puts "proxyd port #{ proxyd_port }"
41
+ puts "infod port #{ infod_port }"
36
42
  puts "worker count #{ worker_count }"
37
43
 
44
+ Girl::Custom.constants.each do | name |
45
+ puts "#{ name } #{ Girl::Custom.const_get( name ).inspect }"
46
+ end
47
+
38
48
  len = CONSTS.map{ | name | name.size }.max
39
49
 
40
50
  CONSTS.each do | name |
@@ -47,7 +57,7 @@ module Girl
47
57
  worker_count.times do | i |
48
58
  workers << fork do
49
59
  $0 = 'girl proxyd worker'
50
- worker = Girl::ProxydWorker.new( proxyd_port )
60
+ worker = Girl::ProxydWorker.new( proxyd_port, infod_port )
51
61
 
52
62
  Signal.trap( :TERM ) do
53
63
  puts "w#{ i } exit"
@@ -4,23 +4,26 @@ module Girl
4
4
  ##
5
5
  # initialize
6
6
  #
7
- def initialize( proxyd_port )
7
+ def initialize( proxyd_port, infod_port )
8
8
  @custom = Girl::ProxydCustom.new
9
9
  @mutex = Mutex.new
10
10
  @reads = []
11
11
  @writes = []
12
- @roles = {} # sock => :dotr / :proxyd / :dst / :tund / :tcpd / :streamd
12
+ @roles = {} # sock => :dotr / :proxyd / :infod / :dst / :tund / :tcpd / :streamd
13
13
  @tund_infos = {} # tund => {}
14
14
  @tcpd_infos = {} # tcpd => {}
15
15
  @dst_infos = {} # dst => {}
16
16
  @streamd_infos = {} # streamd => {}
17
17
  @tunneling_tunds = {} # tunneling_addr => tund
18
18
  @resolv_caches = {} # domain => [ ip, created_at ]
19
+ @traff_ins = {} # im => 0
20
+ @traff_outs = {} # im => 0
19
21
 
20
22
  dotr, dotw = IO.pipe
21
23
  @dotw = dotw
22
24
  add_read( dotr, :dotr )
23
25
  new_a_proxyd( proxyd_port )
26
+ new_a_infod( infod_port )
24
27
  end
25
28
 
26
29
  ##
@@ -30,6 +33,7 @@ module Girl
30
33
  puts "p#{ Process.pid } #{ Time.new } looping"
31
34
  loop_check_expire
32
35
  loop_check_resume
36
+ loop_check_traff
33
37
 
34
38
  loop do
35
39
  rs, ws = IO.select( @reads, @writes )
@@ -42,6 +46,8 @@ module Girl
42
46
  read_dotr( sock )
43
47
  when :proxyd then
44
48
  read_proxyd( sock )
49
+ when :infod then
50
+ read_infod( sock )
45
51
  when :tund then
46
52
  read_tund( sock )
47
53
  when :tcpd then
@@ -137,7 +143,13 @@ module Girl
137
143
  def close_dst( dst )
138
144
  # puts "debug1 close dst"
139
145
  close_sock( dst )
140
- del_dst_info( dst )
146
+ dst_info = del_dst_info( dst )
147
+ streamd = dst_info[ :streamd ]
148
+
149
+ if streamd then
150
+ close_read_streamd( streamd )
151
+ set_streamd_closing_write( streamd )
152
+ end
141
153
  end
142
154
 
143
155
  ##
@@ -197,7 +209,13 @@ module Girl
197
209
  def close_streamd( streamd )
198
210
  # puts "debug1 close streamd"
199
211
  close_sock( streamd )
200
- @streamd_infos.delete( streamd )
212
+ streamd_info = @streamd_infos.delete( streamd )
213
+ dst = streamd_info[ :dst ]
214
+
215
+ if dst then
216
+ close_read_dst( dst )
217
+ set_dst_closing_write( dst )
218
+ end
201
219
  end
202
220
 
203
221
  ##
@@ -231,6 +249,7 @@ module Girl
231
249
  dst_info = @dst_infos[ dst ]
232
250
  end
233
251
 
252
+ dst_info[ :closed_write ] = true
234
253
  dst_info
235
254
  end
236
255
 
@@ -251,6 +270,7 @@ module Girl
251
270
  streamd_info = @streamd_infos[ streamd ]
252
271
  end
253
272
 
273
+ streamd_info[ :closed_write ] = true
254
274
  streamd_info
255
275
  end
256
276
 
@@ -270,10 +290,12 @@ module Girl
270
290
  end
271
291
 
272
292
  dst_id = dst.local_address.ip_port
293
+ tund_info = @tund_infos[ tund ]
273
294
 
274
295
  @dst_infos[ dst ] = {
275
296
  id: dst_id, # id
276
297
  tund: tund, # 对应tund
298
+ im: tund_info[ :im ], # 标识
277
299
  domain_port: domain_port, # 目的地和端口
278
300
  rbuff: '', # 对应的streamd没准备好,暂存读到的流量
279
301
  streamd: nil, # 对应的streamd
@@ -284,12 +306,12 @@ module Girl
284
306
  last_sent_at: nil, # 上一次发出流量(由streamd发出)的时间
285
307
  paused: false, # 是否已暂停读
286
308
  closing: false, # 准备关闭
287
- closing_write: false # 准备关闭写
309
+ closing_write: false, # 准备关闭写
310
+ closed_write: false # 已关闭写
288
311
  }
289
312
 
290
313
  add_read( dst, :dst )
291
314
 
292
- tund_info = @tund_infos[ tund ]
293
315
  tund_info[ :dst_ids ][ src_id ] = dst_id
294
316
  tund_info[ :dsts ][ dst_id ] = dst
295
317
 
@@ -395,6 +417,27 @@ module Girl
395
417
  end
396
418
  end
397
419
 
420
+ ##
421
+ # loop check traff
422
+ #
423
+ def loop_check_traff
424
+ if RESET_TRAFF_DAY > 0 then
425
+ Thread.new do
426
+ loop do
427
+ sleep CHECK_TRAFF_INTERVAL
428
+
429
+ @mutex.synchronize do
430
+ if Time.new.day == RESET_TRAFF_DAY then
431
+ puts "p#{ Process.pid } #{ Time.new } reset traffs"
432
+ @traff_ins.transform_values!{ | _ | 0 }
433
+ @traff_outs.transform_values!{ | _ | 0 }
434
+ end
435
+ end
436
+ end
437
+ end
438
+ end
439
+ end
440
+
398
441
  ##
399
442
  # new a proxyd
400
443
  #
@@ -412,6 +455,18 @@ module Girl
412
455
  add_read( proxyd, :proxyd )
413
456
  end
414
457
 
458
+ ##
459
+ # new a infod
460
+ #
461
+ def new_a_infod( infod_port )
462
+ infod = Socket.new( Socket::AF_INET, Socket::SOCK_DGRAM, 0 )
463
+ infod.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEPORT, 1 )
464
+ infod.bind( Socket.sockaddr_in( infod_port, '127.0.0.1' ) )
465
+
466
+ puts "p#{ Process.pid } #{ Time.new } infod bind on #{ infod_port }"
467
+ add_read( infod, :infod )
468
+ end
469
+
415
470
  ##
416
471
  # next tick
417
472
  #
@@ -488,10 +543,16 @@ module Girl
488
543
  #
489
544
  def set_dst_closing( dst )
490
545
  return if dst.closed?
546
+
491
547
  dst_info = @dst_infos[ dst ]
492
- dst_info[ :closing ] = true
493
- @reads.delete( dst )
494
- add_write( dst )
548
+
549
+ if dst_info[ :closed_write ] then
550
+ close_read_dst( dst )
551
+ else
552
+ dst_info[ :closing ] = true
553
+ @reads.delete( dst )
554
+ add_write( dst )
555
+ end
495
556
  end
496
557
 
497
558
  ##
@@ -499,7 +560,10 @@ module Girl
499
560
  #
500
561
  def set_dst_closing_write( dst )
501
562
  return if dst.closed?
563
+
502
564
  dst_info = @dst_infos[ dst ]
565
+ return if dst_info[ :closed_write ]
566
+
503
567
  dst_info[ :closing_write ] = true
504
568
  add_write( dst )
505
569
  end
@@ -510,9 +574,14 @@ module Girl
510
574
  def set_streamd_closing( streamd )
511
575
  return if streamd.closed?
512
576
  streamd_info = @streamd_infos[ streamd ]
513
- streamd_info[ :closing ] = true
514
- @reads.delete( streamd )
515
- add_write( streamd )
577
+
578
+ if streamd_info[ :closed_write ] then
579
+ close_read_streamd( streamd )
580
+ else
581
+ streamd_info[ :closing ] = true
582
+ @reads.delete( streamd )
583
+ add_write( streamd )
584
+ end
516
585
  end
517
586
 
518
587
  ##
@@ -520,7 +589,10 @@ module Girl
520
589
  #
521
590
  def set_streamd_closing_write( streamd )
522
591
  return if streamd.closed?
592
+
523
593
  streamd_info = @streamd_infos[ streamd ]
594
+ return if streamd_info[ :closed_write ]
595
+
524
596
  streamd_info[ :closing_write ] = true
525
597
  add_write( streamd )
526
598
  end
@@ -565,6 +637,13 @@ module Girl
565
637
  return
566
638
  end
567
639
 
640
+ im = data
641
+
642
+ unless @traff_ins.include?( im ) then
643
+ @traff_ins[ im ] = 0
644
+ @traff_outs[ im ] = 0
645
+ end
646
+
568
647
  tund = Socket.new( Socket::AF_INET, Socket::SOCK_DGRAM, 0 )
569
648
  tund.bind( Socket.sockaddr_in( 0, '0.0.0.0' ) )
570
649
  tund_port = tund.local_address.ip_port
@@ -578,6 +657,7 @@ module Girl
578
657
  add_read( tcpd, :tcpd )
579
658
 
580
659
  tund_info = {
660
+ im: im, # 标识
581
661
  port: tund_port, # 端口
582
662
  tcpd: tcpd, # 对应的tcpd
583
663
  tcpd_port: tcpd_port, # tcpd端口
@@ -601,6 +681,28 @@ module Girl
601
681
  add_proxyd_ctlmsg_tund_port( tund_info )
602
682
  end
603
683
 
684
+ ##
685
+ # read infod
686
+ #
687
+ def read_infod( infod )
688
+ data, addrinfo, rflags, *controls = infod.recvmsg
689
+ ctl_num = data[ 0 ].unpack( 'C' ).first
690
+ # puts "debug1 infod recv #{ ctl_num } #{ addrinfo.inspect }"
691
+
692
+ case ctl_num
693
+ when TRAFF_INFOS then
694
+ data2 = [ TRAFF_INFOS ].pack( 'C' )
695
+
696
+ @traff_ins.keys.sort.each do | im |
697
+ traff_in = @traff_ins[ im ]
698
+ traff_out = @traff_outs[ im ]
699
+ data2 << [ [ im.bytesize ].pack( 'C' ), im, [ traff_in, traff_out ].pack( 'Q>Q>' ) ].join
700
+ end
701
+
702
+ send_data( infod, data2, addrinfo )
703
+ end
704
+ end
705
+
604
706
  ##
605
707
  # read tund
606
708
  #
@@ -672,13 +774,18 @@ module Girl
672
774
  # puts "debug1 accept a streamd"
673
775
  tcpd_info = @tcpd_infos[ tcpd ]
674
776
  tund = tcpd_info[ :tund ]
777
+ tund_info = @tund_infos[ tund ]
675
778
 
676
779
  @streamd_infos[ streamd ] = {
677
- tund: tund, # 对应tund
678
- dst: nil, # 对应dst
679
- domain_port: nil, # dst的目的地和端口
680
- wbuff: '', # 写前,写往近端stream
681
- paused: false # 是否已暂停读
780
+ tund: tund, # 对应tund
781
+ im: tund_info[ :im ], # 标识
782
+ dst: nil, # 对应dst
783
+ domain_port: nil, # dst的目的地和端口
784
+ wbuff: '', # 写前,写往近端stream
785
+ paused: false, # 是否已暂停读
786
+ closing: false, # 准备关闭
787
+ closing_write: false, # 准备关闭写
788
+ closed_write: false # 已关闭写
682
789
  }
683
790
 
684
791
  add_read( streamd, :streamd )
@@ -688,6 +795,8 @@ module Girl
688
795
  # read dst
689
796
  #
690
797
  def read_dst( dst )
798
+ return if dst.closed?
799
+
691
800
  begin
692
801
  data = dst.read_nonblock( READ_SIZE )
693
802
  rescue IO::WaitReadable, Errno::EINTR
@@ -702,6 +811,7 @@ module Girl
702
811
  end
703
812
 
704
813
  dst_info = @dst_infos[ dst ]
814
+ @traff_ins[ dst_info[ :im ] ] += data.bytesize
705
815
  streamd = dst_info[ :streamd ]
706
816
 
707
817
  if streamd then
@@ -732,6 +842,8 @@ module Girl
732
842
  # read streamd
733
843
  #
734
844
  def read_streamd( streamd )
845
+ return if streamd.closed?
846
+
735
847
  begin
736
848
  data = streamd.read_nonblock( READ_SIZE )
737
849
  rescue IO::WaitReadable, Errno::EINTR
@@ -746,6 +858,7 @@ module Girl
746
858
  end
747
859
 
748
860
  streamd_info = @streamd_infos[ streamd ]
861
+ @traff_ins[ streamd_info[ :im ] ] += data.bytesize
749
862
  dst = streamd_info[ :dst ]
750
863
 
751
864
  unless dst then
@@ -866,12 +979,6 @@ module Girl
866
979
  # 处理关闭
867
980
  if dst_info[ :closing ] then
868
981
  close_dst( dst )
869
-
870
- if streamd then
871
- close_read_streamd( streamd )
872
- set_streamd_closing_write( streamd )
873
- end
874
-
875
982
  return
876
983
  end
877
984
 
@@ -904,6 +1011,7 @@ module Girl
904
1011
  # puts "debug2 written dst #{ written }"
905
1012
  data = data[ written..-1 ]
906
1013
  dst_info[ :wbuff ] = data
1014
+ @traff_outs[ dst_info[ :im ] ] += written
907
1015
  end
908
1016
 
909
1017
  ##
@@ -917,12 +1025,6 @@ module Girl
917
1025
  # 处理关闭
918
1026
  if streamd_info[ :closing ] then
919
1027
  close_streamd( streamd )
920
-
921
- if dst then
922
- close_read_dst( dst )
923
- set_dst_closing_write( dst )
924
- end
925
-
926
1028
  return
927
1029
  end
928
1030
 
@@ -955,6 +1057,7 @@ module Girl
955
1057
  # puts "debug2 written streamd #{ written }"
956
1058
  data = data[ written..-1 ]
957
1059
  streamd_info[ :wbuff ] = data
1060
+ @traff_outs[ streamd_info[ :im ] ] += written
958
1061
 
959
1062
  if dst && !dst.closed? then
960
1063
  dst_info = @dst_infos[ dst ]
@@ -1,3 +1,3 @@
1
1
  module Girl
2
- VERSION = '0.93.0'.freeze
2
+ VERSION = '0.94.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: girl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.93.0
4
+ version: 0.94.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - takafan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-12 00:00:00.000000000 Z
11
+ date: 2020-10-15 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: escape evil.
14
14
  email: