rubtella 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.1.0
data/bin/rubtella ADDED
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubtella'
4
+
5
+ case ARGV[0]
6
+ when "start"
7
+ $0 = 'rubtella-base'
8
+
9
+ @p = fork do
10
+ $0 = 'rubtella'
11
+ Signal.trap("TERM") do
12
+ @@logger.info "terminating..."
13
+ File.delete Rubtella::Config::PID_FILE if File.exist? Rubtella::Config::PID_FILE
14
+ exit
15
+ end
16
+
17
+ Thread.new do
18
+ server = Rubtella::Listener.new
19
+ server.listen
20
+ end
21
+
22
+ Thread.new do
23
+ gnutella = Rubtella::Sender.new
24
+ gnutella.connect
25
+ gnutella.send_query("doors")
26
+ end
27
+
28
+ while true
29
+ sleep 100
30
+ end
31
+ end
32
+
33
+ #save pid
34
+ f = File.new Rubtella::Config::PID_FILE, File::CREAT|File::TRUNC|File::RDWR, 0644
35
+ f.puts @p
36
+ f.close
37
+
38
+ Process.detach(@p)
39
+
40
+ when "stop"
41
+ unless File.exist? Rubtella::Config::PID_FILE
42
+ puts 'No pid file found'
43
+ else
44
+ f = File.open Rubtella::Config::PID_FILE
45
+ pid = f.read.to_i
46
+ Process.kill "TERM", pid
47
+ end
48
+ else
49
+ puts "[start|stop]"
50
+ end
data/lib/config/config.rb CHANGED
@@ -9,9 +9,25 @@ module Rubtella
9
9
  guid
10
10
  end
11
11
 
12
- IP_ADDRESS = "127.0.0.1"
13
- PORT = 54321
12
+ if File.exist?(ENV["HOME"] + "/.rubtella/config.rb")
13
+ load ENV["HOME"] + "/.rubtella/config.rb"
14
+ else
15
+ Dir.mkdir(ENV['HOME'] + "/.rubtella") unless File.exist?(ENV['HOME'] + "/.rubtella")
16
+ File.open(ENV["HOME"] + "/.rubtella/config.rb", 'w') do |f|
17
+ f.puts("#put your config here")
18
+ f.puts("#")
19
+ f.puts("# example below")
20
+ f.puts("#")
21
+ f.puts("#IP_ADDRESS = 127.0.0.1")
22
+ f.puts("#PORT = 54321")
23
+ end
24
+ end
25
+
26
+ IP_ADDRESS = "127.0.0.1" unless defined? IP_ADDRESS
27
+ PORT = 54321 unless defined? PORT
28
+
14
29
  GUID = generate_guid
30
+ PID_FILE = ENV["HOME"] + "/.rubtella/rubtella.pid"
15
31
 
16
32
 
17
33
 
@@ -31,30 +31,32 @@ module Rubtella
31
31
  Thread.start do
32
32
 
33
33
  begin
34
- parse_request session
34
+ manage_connection session
35
35
  rescue => e
36
- session.puts "Rubtella Server Error: " + e.to_s
37
- puts "Rubtella Server Error: " + e.to_s
36
+ session.puts "Rubtella Listener Error: " + e.to_s
37
+ @@logger.info "Rubtella Server Error: " + e.to_s
38
38
  ensure
39
39
  session.close
40
40
  end
41
41
 
42
42
  end
43
43
  end #end loop
44
-
45
44
  end
45
+
46
+ def manage_connection stream
47
+ loop do
48
+ @@logger.info 'we\'re listening..'
49
+ resp = stream.recv 1000
50
+ if parse(resp) == "ping"
51
+ pong = TCPData::Builder::Pong.new
52
+ stream.send pong.build , 0
53
+ @@logger.info 'pong send..'
54
+ stream.close
55
+ @@logger.info 'connection closed'
56
+ break
57
+ end
58
+ end
46
59
 
47
- def parse_request request
48
- req = request.recv 1000
49
-
50
- puts req
51
- request.send Sender.pong, 0
52
- puts 'response send!'
53
- req = request.recv 1000
54
- puts 'received content:'
55
-
56
- puts req
57
- puts 'received!'
58
60
  end
59
61
 
60
62
  end
@@ -64,44 +66,58 @@ module Rubtella
64
66
 
65
67
  attr_accessor :peer, :connected
66
68
 
67
- def initialize peer
68
- @peer = peer
69
+ def initialize peer = nil
70
+ @peers = Array.new
71
+ init_peers
72
+
73
+ if peer
74
+ @peers << peer
75
+ end
76
+
77
+ raise RubtellaError, "No peer address! Pleas add peers to hosts file!" if @peers.empty?
78
+
79
+ @peer = @peers.pop
80
+
69
81
  @standard_headers = {"User-Agent" => "Rubtella",
70
82
  "X-Ultrapeer" => "False",
71
83
  "X-Query-Routing" => "0.1"}
84
+
85
+ rescue => e
86
+ @@logger.info e.to_s
72
87
  end
73
88
 
74
89
  def connect
75
- begin
76
- puts "connecting to: #{@peer.ip}:#{@peer.port}"
90
+ @@logger.info "connecting to: #{@peer.ip}:#{@peer.port}"
91
+ stream = nil
92
+ timeout(5) do
77
93
  stream = TCPSocket.new @peer.ip, @peer.port
78
- timeout(5) do
79
- stream.send handshake_req, 0
80
- end
81
- @response = stream.recv 1000
94
+ stream.send handshake_req, 0
95
+ end
96
+ @response = stream.recv 1000
82
97
 
83
- resp = HTTPData::Parser.new @response
84
- stream.send handshake_resp, 0
85
-
86
- if resp.ok?
87
- #connection established
88
- puts 'connection established'
89
- @connected = @peer
90
- puts "Connected with #{@connected.ip} #{@connected.port}"
91
- @@logger.info "Connected with #{@connected.ip} #{@connected.port}"
92
-
93
- manage_connection stream
94
- else
95
- puts 'failed to connect'
96
- @peer = resp.peers.shift
97
- connect
98
- end
99
- rescue Timeout::Error
100
- @peer = resp.peers.shift
98
+ resp = HTTPData::Parser.new @response
99
+ stream.send handshake_resp, 0
100
+
101
+ if resp.ok?
102
+ #connection established
103
+ @@logger.info 'connection established'
104
+ @connected = @peer
105
+ @@logger.info "Connected with #{@connected.ip} #{@connected.port}"
106
+ @@logger.info "Connected with #{@connected.ip} #{@connected.port}"
107
+
108
+ manage_connection stream
109
+ else
110
+ @@logger.info 'failed to connect'
111
+ @peers.concat resp.peers
112
+ @peer = @peers.pop
101
113
  connect
102
- rescue => e
103
- @@logger.info e.to_s
104
114
  end
115
+ rescue Timeout::Error,Errno::ECONNREFUSED
116
+ @@logger.info "Timeout"
117
+ @peer = resp.peers.shift
118
+ connect
119
+ rescue => e
120
+ @@logger.info e.to_s
105
121
  end
106
122
 
107
123
  def handshake_req
@@ -116,14 +132,14 @@ module Rubtella
116
132
 
117
133
  def manage_connection stream
118
134
  loop do
119
- puts 'we\'re listening..'
135
+ @@logger.info 'we\'re listening..'
120
136
  resp = stream.recv 1000
121
137
  if parse(resp) == "ping"
122
138
  pong = TCPData::Builder::Pong.new
123
139
  stream.send pong.build , 0
124
- puts 'pong send..'
140
+ @@logger.info 'pong send..'
125
141
  stream.close
126
- puts 'connection closed'
142
+ @@logger.info 'connection closed'
127
143
  break
128
144
  end
129
145
  end
@@ -134,7 +150,7 @@ module Rubtella
134
150
 
135
151
  def parse message
136
152
  parsed = TCPData::Parser.new message
137
- puts parsed.message
153
+ @@logger.info parsed.message
138
154
 
139
155
  parsed.message
140
156
 
@@ -145,10 +161,19 @@ module Rubtella
145
161
  query = TCPData::Builder::Query.new(:criteria => text)
146
162
  @@logger.info "sending query - #{text}"
147
163
  stream.send query.build, 0
148
- puts 'we\'re listening..'
164
+ @@logger.info 'we\'re listening..'
149
165
  resp = stream.recv 1000
150
166
  parse(resp)
151
167
  end
168
+
169
+ def init_peers
170
+ if File.exist?(ENV["HOME"] + "/.rubtella/hosts")
171
+ hosts_file = File.open ENV["HOME"] + "/.rubtella/hosts"
172
+ hosts = hosts_file.read
173
+ hosts.split("\n")
174
+ hosts.each {|h| @peers << Peer.new(*(h.split(":")))}
175
+ end
176
+ end
152
177
  end
153
178
 
154
179
  end
data/rubtella.gemspec CHANGED
@@ -5,15 +5,15 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rubtella}
8
- s.version = "0.0.2"
8
+ s.version = "0.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Mateusz Zawisza"]
12
- s.date = %q{2010-01-10}
13
- s.default_executable = %q{rubtellad}
12
+ s.date = %q{2010-01-19}
13
+ s.default_executable = %q{rubtella}
14
14
  s.description = %q{Library for Gnuttale in Ruby}
15
15
  s.email = %q{mateusz.zawisza@gmail.com}
16
- s.executables = ["rubtellad"]
16
+ s.executables = ["rubtella"]
17
17
  s.extra_rdoc_files = [
18
18
  "README"
19
19
  ]
@@ -22,7 +22,7 @@ Gem::Specification.new do |s|
22
22
  "README",
23
23
  "Rakefile",
24
24
  "VERSION",
25
- "bin/rubtellad",
25
+ "bin/rubtella",
26
26
  "lib/config/config.rb",
27
27
  "lib/rubtella.rb",
28
28
  "lib/rubtella/errors.rb",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubtella
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mateusz Zawisza
@@ -9,14 +9,14 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-01-10 00:00:00 +01:00
13
- default_executable: rubtellad
12
+ date: 2010-01-19 00:00:00 +01:00
13
+ default_executable: rubtella
14
14
  dependencies: []
15
15
 
16
16
  description: Library for Gnuttale in Ruby
17
17
  email: mateusz.zawisza@gmail.com
18
18
  executables:
19
- - rubtellad
19
+ - rubtella
20
20
  extensions: []
21
21
 
22
22
  extra_rdoc_files:
@@ -26,7 +26,7 @@ files:
26
26
  - README
27
27
  - Rakefile
28
28
  - VERSION
29
- - bin/rubtellad
29
+ - bin/rubtella
30
30
  - lib/config/config.rb
31
31
  - lib/rubtella.rb
32
32
  - lib/rubtella/errors.rb
data/bin/rubtellad DELETED
@@ -1,26 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'rubtella'
4
-
5
- $0 = 'rubtella-base'
6
-
7
- @p = fork do
8
- $0 = 'rubtella'
9
- Thread.new do
10
- server = Rubtella::Listener.new
11
- server.listen
12
- end
13
-
14
- Thread.new do
15
- gnutella = Rubtella::Sender.new Rubtella::Peer.new("70.188.16.73",38093)
16
- gnutella.connect
17
- gnutella.send_query("doors")
18
- end
19
-
20
- while true
21
- sleep 100
22
- end
23
- end
24
-
25
- Process.detach(@p)
26
-