udpbucket 0.0.8 → 0.0.9
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 +7 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +22 -0
- data/README.md +45 -0
- data/Rakefile +36 -0
- data/examples/dns_xlate.rb +24 -0
- data/examples/rsabin.rb +11 -0
- data/lib/udpbucket/core.rb +17 -14
- data/lib/udpbucket/log.rb +5 -0
- data/lib/udpbucket.rb +1 -0
- data/udpbucket.gemspec +18 -0
- metadata +44 -18
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8dded6b7b74f8c9ed42f37b5b0e01ef7f11e81b5
|
4
|
+
data.tar.gz: 66baffdeca1e8fa233c0c8dbd090f705e61d4bff
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f11b2881d7fb037b3aa3891e69a35ec9cf10c700492e21e89923c2bc87ff2b0e61fcef455797f190e4009c736071dcd748992af11d1b6f85424197255312be02
|
7
|
+
data.tar.gz: b45ca23f11f6757fdc6d171abd8326cc47917df2618f7898dc1718a24a8206b4f3a8683056f5eb06fc538b9973f7cb83130d3e7424e89dbea7dd65bb2c4df049
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
udpbucket (0.0.9)
|
5
|
+
asetus (>= 0.0.7)
|
6
|
+
json
|
7
|
+
logger (>= 1.2.8)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
asetus (0.0.7)
|
13
|
+
slop
|
14
|
+
json (1.8.1)
|
15
|
+
logger (1.2.8)
|
16
|
+
slop (3.5.0)
|
17
|
+
|
18
|
+
PLATFORMS
|
19
|
+
ruby
|
20
|
+
|
21
|
+
DEPENDENCIES
|
22
|
+
udpbucket!
|
data/README.md
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
## UDPBucket
|
2
|
+
|
3
|
+
A simple UDP server library using working queue.
|
4
|
+
|
5
|
+
## requirements
|
6
|
+
|
7
|
+
+ ruby 1.9.3+
|
8
|
+
+ json
|
9
|
+
+ asetus 0.0.7+
|
10
|
+
+ logger 1.2.8+
|
11
|
+
|
12
|
+
## install
|
13
|
+
|
14
|
+
> gem install udpbucket
|
15
|
+
>
|
16
|
+
|
17
|
+
## packets
|
18
|
+
|
19
|
+
UDPBucket returns to a block each packet it receives to the listening UDP port formatted in a standard hash.
|
20
|
+
|
21
|
+
## hash format
|
22
|
+
|
23
|
+
{ :client_sock => <socket_object>,
|
24
|
+
:client_ip => 'x.x.x.x',
|
25
|
+
:client_port => xxxxx,
|
26
|
+
:payload => '\x00\xFF\xFF' }
|
27
|
+
|
28
|
+
## example:
|
29
|
+
|
30
|
+
require 'udpbucket'
|
31
|
+
|
32
|
+
begin
|
33
|
+
cfg = { :localhost => '0.0.0.0', :localport => 1024, :debug => 0 }
|
34
|
+
udpbucket = UDPBucket::Core.new cfg
|
35
|
+
udpbucket.listen do |req|
|
36
|
+
if req[:payload] == '\x00\xFF\xFF'
|
37
|
+
req[:client_sock].send '<..some payload..>', 0, req[:client_ip], req[:client_port]
|
38
|
+
udpbucket.debug "reply sent to client: #{req[:client_ip]}:#{req[:client_port]}" if cfg[:debug] == 1
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
## configuration:
|
44
|
+
|
45
|
+
The configuration is loaded at the start via Asetus. If the configuration is not passed to the 'Core' class, Asetus will load the default set (localhost:0.0.0.0,localport:16265,debug:1)
|
data/Rakefile
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler'
|
3
|
+
Bundler.setup
|
4
|
+
rescue => e
|
5
|
+
warn "ERROR: #{e}"
|
6
|
+
exit 1
|
7
|
+
end
|
8
|
+
|
9
|
+
gemspec = eval(File.read(Dir['*.gemspec'].first))
|
10
|
+
file = [gemspec.name, gemspec.version].join('-') + '.gem'
|
11
|
+
|
12
|
+
task :validate do
|
13
|
+
gemspec.validate
|
14
|
+
end
|
15
|
+
|
16
|
+
task :build do
|
17
|
+
system "gem build #{gemspec.name}.gemspec"
|
18
|
+
FileUtils.mkdir_p 'gems'
|
19
|
+
FileUtils.mv file, 'gems'
|
20
|
+
end
|
21
|
+
|
22
|
+
task :install => [ :validate, :build ] do
|
23
|
+
system "sudo -E sh -c \'umask 022; gem install gems/#{file} --no-ri --no-rdoc\'"
|
24
|
+
end
|
25
|
+
|
26
|
+
task :clean do
|
27
|
+
FileUtils.rm_rf 'gems'
|
28
|
+
end
|
29
|
+
|
30
|
+
task :push do
|
31
|
+
system "gem push gems/#{file}"
|
32
|
+
end
|
33
|
+
|
34
|
+
task :remove do
|
35
|
+
system "sudo -E sh -c \'umask 022; gem uninstall #{gemspec.name}\'"
|
36
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'udpbucket'
|
4
|
+
|
5
|
+
resolver = '8.8.8.8'
|
6
|
+
|
7
|
+
begin
|
8
|
+
cfg = { :localhost => '::', :localport => 53, :debug => 1 }
|
9
|
+
udpbucket = UDPBucket::Core.new cfg
|
10
|
+
udpbucket.listen do |pkt_hash|
|
11
|
+
out_sock = UDPSocket.new
|
12
|
+
r = Random.new
|
13
|
+
sport = r.rand(1024..65535)
|
14
|
+
out_sock.bind '0.0.0.0', sport
|
15
|
+
udpbucket.debug "forwarding request to resolver : #{resolver}:53" if cfg[:debug] == 1
|
16
|
+
out_sock.send pkt_hash[:payload], 0, resolver, 53
|
17
|
+
reply, _ = out_sock.recvfrom(1500)
|
18
|
+
re_hash = { :resolver_ip => resolver, :reply => reply }
|
19
|
+
udpbucket.debug "reply received : #{re_hash}" if cfg[:debug] == 1
|
20
|
+
pkt_hash[:client_sock].send reply, 0, pkt_hash[:client_ip], pkt_hash[:client_port]
|
21
|
+
out_sock.close
|
22
|
+
udpbucket.debug "translation completed" if cfg[:debug] == 1
|
23
|
+
end
|
24
|
+
end
|
data/examples/rsabin.rb
ADDED
data/lib/udpbucket/core.rb
CHANGED
@@ -1,23 +1,26 @@
|
|
1
1
|
module UDPBucket
|
2
2
|
class Core
|
3
|
+
require 'asetus'
|
3
4
|
|
4
|
-
def initialize
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
def initialize usercfg={}
|
6
|
+
cfgs = Asetus.new :name=>'udpbucket', :load=>false
|
7
|
+
cfgs.default.debug = usercfg[:debug] || 0
|
8
|
+
cfgs.default.localhost = usercfg[:localhost] || '0.0.0.0'
|
9
|
+
cfgs.default.localport = usercfg[:localport] || 16265
|
10
|
+
cfgs.load
|
11
|
+
@cfg = cfgs.cfg
|
12
|
+
load
|
13
|
+
end
|
14
|
+
|
15
|
+
def load
|
9
16
|
@rx_queue = Queue.new
|
10
|
-
if IPAddr.new(@localhost).ipv6?
|
17
|
+
if IPAddr.new(@cfg.localhost).ipv6?
|
11
18
|
@sock = UDPSocket.new Socket::AF_INET6
|
12
19
|
else
|
13
20
|
@sock = UDPSocket.new
|
14
21
|
end
|
15
|
-
@sock.bind @localhost, @localport
|
16
|
-
debug "udpbucket server up: #{@localhost}:#{@localport}" if @debug == 1
|
17
|
-
end
|
18
|
-
|
19
|
-
def debug msg
|
20
|
-
puts [ "D, [#{Time.now} ", [ "#", "#{Process.pid}" ].join, "] DEBUG -- ", msg ].join
|
22
|
+
@sock.bind @cfg.localhost, @cfg.localport
|
23
|
+
Log.debug "udpbucket server up: #{@cfg.localhost}:#{@cfg.localport}" if @cfg.debug == 1
|
21
24
|
end
|
22
25
|
|
23
26
|
def listen
|
@@ -28,7 +31,7 @@ module UDPBucket
|
|
28
31
|
buffer, sockaddr = @sock.recvfrom_nonblock(1500)
|
29
32
|
pkt = { :client_sock => @sock, :client_ip => sockaddr[3], :client_port => sockaddr[1], :payload => buffer }
|
30
33
|
@rx_queue << pkt
|
31
|
-
debug "packet queued (queue size:#{@rx_queue.size}): #{pkt}" if @debug == 1
|
34
|
+
Log.debug "packet queued (queue size:#{@rx_queue.size}): #{pkt}" if @cfg.debug == 1
|
32
35
|
end
|
33
36
|
end
|
34
37
|
end
|
@@ -36,7 +39,7 @@ module UDPBucket
|
|
36
39
|
while true do
|
37
40
|
begin
|
38
41
|
yield @rx_queue.pop
|
39
|
-
debug "yield to block (queue size:#{@rx_queue.size})" if @debug == 1
|
42
|
+
Log.debug "yield to block (queue size:#{@rx_queue.size})" if @cfg.debug == 1
|
40
43
|
end
|
41
44
|
end
|
42
45
|
end
|
data/lib/udpbucket.rb
CHANGED
data/udpbucket.gemspec
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'udpbucket'
|
3
|
+
s.version = '0.0.9'
|
4
|
+
s.platform = Gem::Platform::RUBY
|
5
|
+
s.authors = [ 'Samer Abdel-Hafez' ]
|
6
|
+
s.email = %w( sam@arahant.net )
|
7
|
+
s.homepage = 'http://github.com/nopedial/udpbucket'
|
8
|
+
s.summary = 'udp bucket'
|
9
|
+
s.description = 'a lightweight udp server'
|
10
|
+
s.rubyforge_project = s.name
|
11
|
+
s.files = `git ls-files`.split("\n")
|
12
|
+
s.executables = %w( )
|
13
|
+
s.require_path = 'lib'
|
14
|
+
|
15
|
+
s.add_dependency 'json'
|
16
|
+
s.add_dependency 'asetus', '>= 0.0.7'
|
17
|
+
s.add_dependency 'logger', '>= 1.2.8'
|
18
|
+
end
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: udpbucket
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.9
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Samer Abdel-Hafez
|
@@ -14,19 +13,45 @@ dependencies:
|
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: json
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: asetus
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.0.7
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.0.7
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: logger
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.2.8
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.2.8
|
30
55
|
description: a lightweight udp server
|
31
56
|
email:
|
32
57
|
- sam@arahant.net
|
@@ -34,36 +59,37 @@ executables: []
|
|
34
59
|
extensions: []
|
35
60
|
extra_rdoc_files: []
|
36
61
|
files:
|
62
|
+
- Gemfile
|
63
|
+
- Gemfile.lock
|
64
|
+
- README.md
|
65
|
+
- Rakefile
|
66
|
+
- examples/dns_xlate.rb
|
67
|
+
- examples/rsabin.rb
|
37
68
|
- lib/udpbucket.rb
|
38
69
|
- lib/udpbucket/core.rb
|
70
|
+
- lib/udpbucket/log.rb
|
71
|
+
- udpbucket.gemspec
|
39
72
|
homepage: http://github.com/nopedial/udpbucket
|
40
73
|
licenses: []
|
74
|
+
metadata: {}
|
41
75
|
post_install_message:
|
42
76
|
rdoc_options: []
|
43
77
|
require_paths:
|
44
78
|
- lib
|
45
79
|
required_ruby_version: !ruby/object:Gem::Requirement
|
46
|
-
none: false
|
47
80
|
requirements:
|
48
|
-
- -
|
81
|
+
- - '>='
|
49
82
|
- !ruby/object:Gem::Version
|
50
83
|
version: '0'
|
51
|
-
segments:
|
52
|
-
- 0
|
53
|
-
hash: 427306861
|
54
84
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
55
|
-
none: false
|
56
85
|
requirements:
|
57
|
-
- -
|
86
|
+
- - '>='
|
58
87
|
- !ruby/object:Gem::Version
|
59
88
|
version: '0'
|
60
|
-
segments:
|
61
|
-
- 0
|
62
|
-
hash: 427306861
|
63
89
|
requirements: []
|
64
90
|
rubyforge_project: udpbucket
|
65
|
-
rubygems_version:
|
91
|
+
rubygems_version: 2.0.14
|
66
92
|
signing_key:
|
67
|
-
specification_version:
|
93
|
+
specification_version: 4
|
68
94
|
summary: udp bucket
|
69
95
|
test_files: []
|