torrenter 0.0.4 → 0.0.5
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/torrenter/message/messager.rb +21 -22
- data/lib/torrenter/peer.rb +3 -6
- data/lib/torrenter/peer_state.rb +17 -0
- data/lib/torrenter/reactor.rb +17 -10
- data/lib/torrenter/torrent_reader.rb +12 -11
- data/lib/torrenter/udp_tracker.rb +1 -11
- data/lib/torrenter/version.rb +1 -1
- data/lib/torrenter.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a3773b22bb18ac1dc0b3ccd2994889a9f21bbc84
|
4
|
+
data.tar.gz: cd433369ba505739ad4672dae2b5e81a8b048971
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0a25c88408740951f0400a2f723d5a02265a6d0a71e6af317b82913b3a58453f06bccd26af66349a8e276f25b56ca652b2ae7d1b392d98b7f4842cd9759ba233
|
7
|
+
data.tar.gz: 30b43deacc081ce8475a5e1ac83e058f10fdc7782a188d835e6da602438714f9e2a46b851f9d6fad83b8a84d498d84f39e62f5baa8e9c67f8e16ab5c2be77ea1
|
@@ -14,34 +14,19 @@ module Torrenter
|
|
14
14
|
rescue *EXCEPTIONS
|
15
15
|
@status = false
|
16
16
|
''
|
17
|
-
# ''
|
18
|
-
# rescue Errno::ECONNREFUSED
|
19
|
-
# @status = false
|
20
|
-
# ''
|
21
|
-
# rescue Errno::EPIPE
|
22
|
-
# @status = false
|
23
|
-
# ''
|
24
17
|
end
|
25
18
|
end
|
26
19
|
|
27
20
|
def recv_data(bytes=BLOCK, opts={})
|
28
21
|
begin
|
29
|
-
Timeout::timeout(
|
22
|
+
Timeout::timeout(5) { buffer << @socket.recv_nonblock(bytes) }
|
30
23
|
rescue Timeout::Error
|
31
24
|
''
|
32
25
|
rescue *EXCEPTIONS
|
33
26
|
@status = false
|
34
27
|
''
|
35
|
-
# ''
|
36
|
-
# rescue Errno::ECONNREFUSED
|
37
|
-
# ''
|
38
|
-
# rescue Errno::ECONNRESET
|
39
|
-
# ''
|
40
28
|
rescue IO::EAGAINWaitReadable
|
41
29
|
''
|
42
|
-
# rescue Errno::ETIMEDOUT
|
43
|
-
# @status = false
|
44
|
-
# @buffer = ''
|
45
30
|
end
|
46
31
|
end
|
47
32
|
|
@@ -131,6 +116,7 @@ module Torrenter
|
|
131
116
|
elsif buffer.bytesize == 4 && buffer[0..3] == KEEP_ALIVE
|
132
117
|
buffer.slice!(0..3)
|
133
118
|
else
|
119
|
+
|
134
120
|
# p @buffer[0..3].unp@buack("C*")
|
135
121
|
case @buffer[4]
|
136
122
|
when INTERESTED
|
@@ -144,17 +130,22 @@ module Torrenter
|
|
144
130
|
parse_bitfield
|
145
131
|
send_interested if buffer.empty?
|
146
132
|
when PIECE
|
147
|
-
@
|
148
|
-
if buffer.bytesize >= @length
|
133
|
+
@msg_length = buffer[0..3].unpack("N*").first + 4
|
149
134
|
|
135
|
+
if block_finished?
|
150
136
|
buffer.slice!(0..12)
|
151
|
-
|
152
|
-
|
137
|
+
|
138
|
+
# the metadata is sliced off.
|
139
|
+
|
140
|
+
@offset += (@msg_length - 13)
|
141
|
+
|
153
142
|
# buffer is reduced
|
143
|
+
|
154
144
|
pack_buffer
|
155
145
|
# that means the bytes for that block have been collected entirely.
|
156
146
|
# the buffer becomes empty
|
157
147
|
if pieces_remaining(master) > 1
|
148
|
+
|
158
149
|
if piece_size == @piece_len
|
159
150
|
pack_file(master)
|
160
151
|
evaluate_index(master)
|
@@ -172,7 +163,7 @@ module Torrenter
|
|
172
163
|
end
|
173
164
|
end
|
174
165
|
else
|
175
|
-
recv_data(@
|
166
|
+
recv_data(@msg_length - buffer.bytesize)
|
176
167
|
end
|
177
168
|
# piece
|
178
169
|
when CHOKE
|
@@ -197,7 +188,7 @@ module Torrenter
|
|
197
188
|
end
|
198
189
|
|
199
190
|
def pack_buffer
|
200
|
-
@block_map << @buffer.slice!(0...(@
|
191
|
+
@block_map << @buffer.slice!(0...(@msg_length - 13))
|
201
192
|
end
|
202
193
|
|
203
194
|
def pack_file(master)
|
@@ -225,4 +216,12 @@ module Torrenter
|
|
225
216
|
def pack(i)
|
226
217
|
[i].pack("I>")
|
227
218
|
end
|
219
|
+
|
220
|
+
def block_finished?
|
221
|
+
buffer.bytesize >= @msg_length
|
222
|
+
end
|
223
|
+
|
224
|
+
def piece_finished?
|
225
|
+
|
226
|
+
end
|
228
227
|
end
|
data/lib/torrenter/peer.rb
CHANGED
@@ -1,13 +1,10 @@
|
|
1
|
-
# contains the peer information
|
2
1
|
module Torrenter
|
3
2
|
class Peer
|
4
3
|
include Torrenter
|
5
|
-
# for non outside vars use the @ and remove them from
|
6
4
|
|
7
|
-
attr_reader :socket, :peer, :sha_list, :piece_len, :info_hash, :status, :index
|
5
|
+
attr_reader :socket, :peer, :sha_list, :piece_len, :info_hash, :status, :index, :msg_length
|
8
6
|
attr_accessor :piece_index, :offset, :buffer, :block_map
|
9
7
|
|
10
|
-
|
11
8
|
def initialize(peer, file_list, peer_info={})
|
12
9
|
@peer = peer
|
13
10
|
@info_hash = peer_info[:info_hash]
|
@@ -32,7 +29,7 @@ module Torrenter
|
|
32
29
|
def connect
|
33
30
|
puts "\nConnecting to IP: #{peer[:ip]} PORT: #{peer[:port]}"
|
34
31
|
begin
|
35
|
-
Timeout::timeout(
|
32
|
+
Timeout::timeout(1) { @socket = TCPSocket.new(peer[:ip], peer[:port]) }
|
36
33
|
rescue Timeout::Error
|
37
34
|
puts "Timed out."
|
38
35
|
rescue Errno::EADDRNOTAVAIL
|
@@ -44,7 +41,7 @@ module Torrenter
|
|
44
41
|
end
|
45
42
|
|
46
43
|
if @socket
|
47
|
-
|
44
|
+
puts "Connected!"
|
48
45
|
@socket.write(handshake)
|
49
46
|
@status = true
|
50
47
|
else
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Torrenter
|
2
|
+
|
3
|
+
# The buffer state should be responsible ONLY for the handling of non-metadata bytes.
|
4
|
+
# the messaging behavior should and ought to remain with the peer class, though
|
5
|
+
# in truth, it may be better if I didnt do that.
|
6
|
+
|
7
|
+
# So, if the state of the buffer reaches a certain step in its process involving the piece
|
8
|
+
# the buffer state should be fired off.
|
9
|
+
|
10
|
+
# instead of initialiazing it with the buffer,
|
11
|
+
|
12
|
+
class BufferState < Peer
|
13
|
+
def examine(buffer, msg_length)
|
14
|
+
binding.pry
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/torrenter/reactor.rb
CHANGED
@@ -31,31 +31,38 @@ module Torrenter
|
|
31
31
|
def message_reactor
|
32
32
|
modify_index
|
33
33
|
if !@master_index.all? { |index| index == :downloaded }
|
34
|
-
@peers.each { |peer| peer.connect if active_peers.size <
|
34
|
+
@peers.each { |peer| peer.connect if active_peers.size < 8 }
|
35
35
|
puts "You are now connected to #{active_peers.size} peers."
|
36
36
|
loop do
|
37
37
|
break if @master_index.all? { |piece| piece == :downloaded }
|
38
38
|
@peers.each do |peer|
|
39
39
|
$update = { index: indices, peer_count: peer_data }
|
40
|
-
|
41
40
|
piece_count = @master_index.count(:downloaded)
|
41
|
+
|
42
42
|
if peer.status
|
43
43
|
peer.state(@master_index, @blocks) # unless peer.piece_index.all? { |piece| piece == :downloaded }
|
44
|
+
|
44
45
|
if @master_index.count(:downloaded) > piece_count
|
45
|
-
|
46
46
|
system("clear")
|
47
47
|
puts download_bar + "Downloading from #{active_peers.size} active peers"
|
48
48
|
end
|
49
|
-
|
50
|
-
peer.connect
|
49
|
+
else
|
50
|
+
@peers.each { |peer| peer.connect if Time.now.to_i % 60 == 0 }
|
51
51
|
end
|
52
52
|
end
|
53
53
|
end
|
54
|
-
stop_downloading
|
55
|
-
seperate_data_dump_into_files
|
56
54
|
else
|
57
|
-
upload_data
|
55
|
+
# upload_data
|
58
56
|
end
|
57
|
+
seperate_data_dump_into_files
|
58
|
+
end
|
59
|
+
|
60
|
+
def piece_done?(peer)
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
def block_done?(peer)
|
65
|
+
|
59
66
|
end
|
60
67
|
|
61
68
|
def indices
|
@@ -80,7 +87,7 @@ module Torrenter
|
|
80
87
|
end
|
81
88
|
|
82
89
|
def active_peers
|
83
|
-
@peers.select { |peer| peer.
|
90
|
+
@peers.select { |peer| peer.status }
|
84
91
|
end
|
85
92
|
|
86
93
|
def index_percentages
|
@@ -122,7 +129,7 @@ module Torrenter
|
|
122
129
|
offset += length
|
123
130
|
end
|
124
131
|
else
|
125
|
-
File.open("#{folder}/#{@file_list['name']
|
132
|
+
File.open("#{folder}/#{@file_list['name']}", 'w') { |data| data << File.read($data_dump) }
|
126
133
|
end
|
127
134
|
File.delete($data_dump)
|
128
135
|
end
|
@@ -1,6 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
1
|
module Torrenter
|
5
2
|
class TorrentReader
|
6
3
|
attr_reader :stream
|
@@ -10,6 +7,7 @@ module Torrenter
|
|
10
7
|
@sha = Digest::SHA1.digest(stream['info'].bencode)
|
11
8
|
@piece_length = stream['info']['piece length']
|
12
9
|
@sha_list = stream['info']['pieces']
|
10
|
+
@sha_size = stream['info']['pieces'].size / 20
|
13
11
|
end
|
14
12
|
|
15
13
|
def determine_protocol
|
@@ -23,20 +21,24 @@ module Torrenter
|
|
23
21
|
tracker = build_tracker(track)
|
24
22
|
|
25
23
|
tracker.connect
|
24
|
+
|
26
25
|
if tracker.connected?
|
27
26
|
@peers = tracker.address_list
|
28
|
-
break
|
29
27
|
end
|
28
|
+
|
29
|
+
break if @peers
|
30
30
|
end
|
31
31
|
|
32
|
-
|
32
|
+
if @peers
|
33
|
+
establish_reactor
|
34
|
+
end
|
33
35
|
end
|
34
36
|
|
35
37
|
def peer_info
|
36
38
|
{
|
37
39
|
:info_hash => @sha,
|
38
40
|
:piece_length => @piece_length,
|
39
|
-
:sha_list =>
|
41
|
+
:sha_list => sha_pieces,
|
40
42
|
:piece_index => Array.new(@sha_list.size) { false }
|
41
43
|
}
|
42
44
|
end
|
@@ -58,14 +60,13 @@ module Torrenter
|
|
58
60
|
end
|
59
61
|
|
60
62
|
def sha_pieces
|
61
|
-
|
63
|
+
start, term = -20, 0
|
64
|
+
Array.new(@sha_size) { start += 20; term += 20; @sha_list[start...term]}
|
62
65
|
end
|
63
66
|
|
64
67
|
def establish_reactor
|
65
|
-
react = Reactor.new(@peers,
|
66
|
-
|
67
|
-
react.message_reactor
|
68
|
-
end
|
68
|
+
react = Reactor.new(@peers, sha_pieces, @piece_length, @file_list)
|
69
|
+
react.message_reactor
|
69
70
|
end
|
70
71
|
end
|
71
72
|
end
|
@@ -37,17 +37,7 @@ module Torrenter
|
|
37
37
|
Socket.getaddrinfo(@url, @port)[0][3]
|
38
38
|
end
|
39
39
|
|
40
|
-
def connect_to_udp_host
|
41
|
-
begin
|
42
|
-
@socket.connect(@ip, @port)
|
43
|
-
return self
|
44
|
-
rescue
|
45
|
-
false
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
40
|
def address_list
|
50
|
-
|
51
41
|
@connection_id = @response[-8..-1]
|
52
42
|
@transaction_id = [rand(10000)].pack("I>")
|
53
43
|
send_msg(announce_msg)
|
@@ -55,7 +45,7 @@ module Torrenter
|
|
55
45
|
read_response
|
56
46
|
|
57
47
|
parse_announce if @response[0..3] == action(1)
|
58
|
-
parse_addresses(@response, @response.size)
|
48
|
+
parse_addresses(@response, @response.size / 6)
|
59
49
|
end
|
60
50
|
|
61
51
|
def parse_announce
|
data/lib/torrenter/version.rb
CHANGED
data/lib/torrenter.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: torrenter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- wismer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-28 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: BitTorrent Client written in Ruby
|
14
14
|
email:
|
@@ -24,6 +24,7 @@ files:
|
|
24
24
|
- lib/torrenter/message/message_types.rb
|
25
25
|
- lib/torrenter/message/messager.rb
|
26
26
|
- lib/torrenter/peer.rb
|
27
|
+
- lib/torrenter/peer_state.rb
|
27
28
|
- lib/torrenter/reactor.rb
|
28
29
|
- lib/torrenter/torrent_reader.rb
|
29
30
|
- lib/torrenter/udp_tracker.rb
|