auser-columbus 0.0.1
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.
- data/LICENSE +20 -0
- data/README.rdoc +7 -0
- data/VERSION.yml +4 -0
- data/bin/columbus +22 -0
- data/bin/columbus-client +31 -0
- data/bin/columbus-server +26 -0
- data/lib/columbus.rb +8 -0
- data/lib/columbus/client.rb +64 -0
- data/lib/columbus/server.rb +50 -0
- data/test/columbus_client_test.rb +0 -0
- data/test/columbus_server_test.rb +16 -0
- data/test/fixtures/ifconfig-mac +38 -0
- data/test/fixtures/ifconfig-vmware +58 -0
- data/test/test_helper.rb +10 -0
- metadata +72 -0
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Ari Lerner
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
data/VERSION.yml
ADDED
data/bin/columbus
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "rubygems"
|
3
|
+
require ::File.dirname(__FILE__) + "/../lib/columbus"
|
4
|
+
require 'git-style-binary/command'
|
5
|
+
|
6
|
+
GitStyleBinary.primary do
|
7
|
+
@theme = :short
|
8
|
+
|
9
|
+
version "Columbus"
|
10
|
+
banner <<-EOS
|
11
|
+
Usage: #{$0} #{all_options_string} COMMAND [ARGS]
|
12
|
+
|
13
|
+
The #{$0} subcommands commands are:
|
14
|
+
\#{GitStyleBinary.pretty_known_subcommands.join(" ")}
|
15
|
+
|
16
|
+
See '#{$0} help COMMAND' for more information on a specific command.
|
17
|
+
EOS
|
18
|
+
|
19
|
+
run do |command|
|
20
|
+
puts "You need to type a subcommand. Use -h for more"
|
21
|
+
end
|
22
|
+
end
|
data/bin/columbus-client
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "rubygems"
|
3
|
+
require ::File.dirname(__FILE__) + "/../lib/columbus"
|
4
|
+
require 'git-style-binary/command'
|
5
|
+
|
6
|
+
GitStyleBinary.command do
|
7
|
+
@theme = :short
|
8
|
+
|
9
|
+
version "Columbus client"
|
10
|
+
banner <<-EOS
|
11
|
+
Usage: #{$0} #{all_options_string} COMMAND [ARGS]
|
12
|
+
EOS
|
13
|
+
|
14
|
+
opt :discover_type, "Type of discovery message", :default => nil
|
15
|
+
opt :query, "Query to perform on the service"
|
16
|
+
|
17
|
+
run do |command|
|
18
|
+
|
19
|
+
Columbus::Client.discover_type = command[:discover_type] unless command[:discover_type].nil?
|
20
|
+
|
21
|
+
# Columbus::Client.list
|
22
|
+
Columbus::Client.service_list.each do |s|
|
23
|
+
if command[:query]
|
24
|
+
puts s.send(command[:query].to_sym)
|
25
|
+
else
|
26
|
+
puts "#{s.name}\t#{s.host}\t#{s.port}\t#{s.description}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
data/bin/columbus-server
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "rubygems"
|
3
|
+
require ::File.dirname(__FILE__) + "/../lib/columbus"
|
4
|
+
require 'git-style-binary/command'
|
5
|
+
|
6
|
+
GitStyleBinary.command do
|
7
|
+
@theme = :short
|
8
|
+
|
9
|
+
version "Columbus"
|
10
|
+
banner <<-EOS
|
11
|
+
Usage: #{$0} #{all_options_string} COMMAND [ARGS]
|
12
|
+
EOS
|
13
|
+
|
14
|
+
opt :interface, "The interface to pull from", :default => "vmnet8"
|
15
|
+
opt :name, "Name to broadcast", :type => String
|
16
|
+
opt :description, "Description to broadcast", :type => String
|
17
|
+
|
18
|
+
run do |command|
|
19
|
+
interface = command[:interface]
|
20
|
+
|
21
|
+
Columbus::Server.name = command[:name] unless command[:name].nil?
|
22
|
+
Columbus::Server.description = command[:description] unless command[:description].nil?
|
23
|
+
|
24
|
+
Columbus::Server.announce(interface)
|
25
|
+
end
|
26
|
+
end
|
data/lib/columbus.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
=begin rdoc
|
2
|
+
Columbus Dns-sd lookup
|
3
|
+
|
4
|
+
Client
|
5
|
+
=end
|
6
|
+
require "set"
|
7
|
+
|
8
|
+
module Columbus
|
9
|
+
class FoundService
|
10
|
+
attr_accessor :name, :host, :port, :description
|
11
|
+
def initialize(name, host, port, description)
|
12
|
+
@name = name
|
13
|
+
@host = host
|
14
|
+
@port = port
|
15
|
+
@description = description
|
16
|
+
end
|
17
|
+
end
|
18
|
+
class Client
|
19
|
+
class << self
|
20
|
+
|
21
|
+
attr_accessor :discover_type
|
22
|
+
|
23
|
+
def discover_type
|
24
|
+
@discover_type ||= "_presence._tcp"
|
25
|
+
end
|
26
|
+
|
27
|
+
def discover(timeout=5)
|
28
|
+
waiting_thread = Thread.current
|
29
|
+
|
30
|
+
dns = DNSSD.browse discover_type do |reply|
|
31
|
+
DNSSD.resolve reply.name, reply.type, reply.domain do |resolve_reply|
|
32
|
+
service = FoundService.new(reply.name,
|
33
|
+
resolve_reply.target,
|
34
|
+
resolve_reply.port,
|
35
|
+
(resolve_reply.text_record['description'].to_s rescue ""))
|
36
|
+
begin
|
37
|
+
yield service
|
38
|
+
rescue Done
|
39
|
+
waiting_thread.run
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
puts "Gathering for up to #{timeout} seconds for #{discover_type}..."
|
44
|
+
sleep timeout
|
45
|
+
dns.stop
|
46
|
+
end
|
47
|
+
|
48
|
+
def service_list
|
49
|
+
list = Set.new
|
50
|
+
discover { |obj| list << obj }
|
51
|
+
return list
|
52
|
+
end
|
53
|
+
|
54
|
+
def list
|
55
|
+
service_list.each do |service|
|
56
|
+
puts "=== #{service.name} on #{service.host}:#{service.port} ==="
|
57
|
+
puts " found #{service.name}"
|
58
|
+
puts " #{service.description}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
=begin rdoc
|
2
|
+
Columbus Dns-sd lookup
|
3
|
+
|
4
|
+
Server
|
5
|
+
=end
|
6
|
+
module Columbus
|
7
|
+
class Server
|
8
|
+
class << self
|
9
|
+
|
10
|
+
attr_accessor :name, :description
|
11
|
+
|
12
|
+
def announce(interface="vmnet8", t="_presence", proto="tcp", port=9419)
|
13
|
+
@interface = interface
|
14
|
+
while true do
|
15
|
+
DNSSD.register(name, "#{t}._#{proto}", 'local', port, text_record.encode) do |rr|
|
16
|
+
vprint "."
|
17
|
+
end
|
18
|
+
sleep(90)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def text_record
|
23
|
+
@text_record = DNSSD::TextRecord.new
|
24
|
+
@text_record['description'] = @description || map_ip_to_interface[@interface]
|
25
|
+
@text_record
|
26
|
+
end
|
27
|
+
|
28
|
+
def map_ip_to_interface(str=ifconfig)
|
29
|
+
out = {}
|
30
|
+
@current_interface = nil
|
31
|
+
str.split("\n").collect do |line|
|
32
|
+
iface = line.match(/^([a-zA-Z]+(\d)+)(:)?/)
|
33
|
+
@current_interface = iface.captures.first.to_s if iface
|
34
|
+
|
35
|
+
ip = line.match(/inet (addr:)?(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/i)
|
36
|
+
if ip && @current_interface
|
37
|
+
ip = ip.captures.compact.to_s.gsub(/addr:/, '')
|
38
|
+
out.merge!({@current_interface => ip})
|
39
|
+
end
|
40
|
+
end
|
41
|
+
out
|
42
|
+
end
|
43
|
+
|
44
|
+
def ifconfig
|
45
|
+
%x{ifconfig}
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
File without changes
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ColumbusTest < Test::Unit::TestCase
|
4
|
+
should "be able to get the ip" do
|
5
|
+
assert_equal Columbus::Server.map_ip_to_interface.class, Hash
|
6
|
+
end
|
7
|
+
%w(mac vmware).each do |n|
|
8
|
+
should "be able to parse data on #{n}" do
|
9
|
+
data = open(::File.dirname(__FILE__) + "/fixtures/ifconfig-#{n}").read
|
10
|
+
assert_equal Columbus::Server.map_ip_to_interface(data)["vmnet1"], "172.16.66.1"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
should "have an text_record" do
|
14
|
+
assert_equal Columbus::Server.text_record.class, DNSSD::TextRecord
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
|
2
|
+
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
|
3
|
+
inet 127.0.0.1 netmask 0xff000000
|
4
|
+
inet6 ::1 prefixlen 128
|
5
|
+
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
|
6
|
+
stf0: flags=0<> mtu 1280
|
7
|
+
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
|
8
|
+
inet6 fe80::223:dfff:fe7f:55e4%en0 prefixlen 64 scopeid 0x4
|
9
|
+
inet 10.45.10.228 netmask 0xfffffe00 broadcast 10.45.11.255
|
10
|
+
ether 00:23:df:7f:55:e4
|
11
|
+
media: autoselect (100baseTX <full-duplex>) status: active
|
12
|
+
supported media: none autoselect 10baseT/UTP <half-duplex> 10baseT/UTP <full-duplex> 10baseT/UTP <full-duplex,flow-control> 10baseT/UTP <full-duplex,hw-loopback> 100baseTX <half-duplex> 100baseTX <full-duplex> 100baseTX <full-duplex,flow-control> 100baseTX <full-duplex,hw-loopback> 1000baseT <full-duplex> 1000baseT <full-duplex,flow-control> 1000baseT <full-duplex,hw-loopback>
|
13
|
+
fw0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 4078
|
14
|
+
lladdr 00:23:df:ff:fe:7f:55:e4
|
15
|
+
media: autoselect <full-duplex> status: inactive
|
16
|
+
supported media: autoselect <full-duplex>
|
17
|
+
en1: flags=8823<UP,BROADCAST,SMART,SIMPLEX,MULTICAST> mtu 1500
|
18
|
+
ether 00:23:6c:8d:c8:cc
|
19
|
+
media: autoselect (<unknown type>) status: inactive
|
20
|
+
supported media: autoselect
|
21
|
+
vmnet8: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
|
22
|
+
inet 192.168.248.1 netmask 0xffffff00 broadcast 192.168.248.255
|
23
|
+
ether 00:50:56:c0:00:08
|
24
|
+
vmnet1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
|
25
|
+
inet 172.16.66.1 netmask 0xffffff00 broadcast 172.16.66.255
|
26
|
+
ether 00:50:56:c0:00:01
|
27
|
+
en2: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
|
28
|
+
inet6 fe80::21c:42ff:fe00:8%en2 prefixlen 64 scopeid 0x9
|
29
|
+
inet 10.211.55.2 netmask 0xffffff00 broadcast 10.211.55.255
|
30
|
+
ether 00:1c:42:00:00:08
|
31
|
+
media: autoselect status: active
|
32
|
+
supported media: autoselect
|
33
|
+
en3: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
|
34
|
+
inet6 fe80::21c:42ff:fe00:9%en3 prefixlen 64 scopeid 0xa
|
35
|
+
inet 10.37.129.2 netmask 0xffffff00 broadcast 10.37.129.255
|
36
|
+
ether 00:1c:42:00:00:09
|
37
|
+
media: autoselect status: active
|
38
|
+
supported media: autoselect
|
@@ -0,0 +1,58 @@
|
|
1
|
+
br0 Link encap:Ethernet HWaddr 00:1b:fc:2e:ac:a0
|
2
|
+
inet addr:192.168.4.10 Bcast:192.168.4.255 Mask:255.255.255.0
|
3
|
+
inet6 addr: fe80::21b:fcff:fe2e:aca0/64 Scope:Link
|
4
|
+
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
|
5
|
+
RX packets:6200715 errors:0 dropped:0 overruns:0 frame:0
|
6
|
+
TX packets:3019659 errors:0 dropped:0 overruns:0 carrier:0
|
7
|
+
collisions:0 txqueuelen:0
|
8
|
+
RX bytes:7049562204 (7.0 GB) TX bytes:2425295654 (2.4 GB)
|
9
|
+
|
10
|
+
eth0 Link encap:Ethernet HWaddr 00:04:e2:fb:fa:fc
|
11
|
+
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
|
12
|
+
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
|
13
|
+
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
|
14
|
+
collisions:0 txqueuelen:1000
|
15
|
+
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
|
16
|
+
Interrupt:17
|
17
|
+
|
18
|
+
eth1 Link encap:Ethernet HWaddr 00:1b:fc:2e:ac:a0
|
19
|
+
inet6 addr: fe80::21b:fcff:fe2e:aca0/64 Scope:Link
|
20
|
+
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
|
21
|
+
RX packets:6431548 errors:0 dropped:0 overruns:0 frame:0
|
22
|
+
TX packets:3178254 errors:0 dropped:0 overruns:0 carrier:0
|
23
|
+
collisions:0 txqueuelen:1000
|
24
|
+
RX bytes:7314656702 (7.3 GB) TX bytes:2465850613 (2.4 GB)
|
25
|
+
Interrupt:17
|
26
|
+
|
27
|
+
lo Link encap:Local Loopback
|
28
|
+
inet addr:127.0.0.1 Mask:255.0.0.0
|
29
|
+
inet6 addr: ::1/128 Scope:Host
|
30
|
+
UP LOOPBACK RUNNING MTU:16436 Metric:1
|
31
|
+
RX packets:32717 errors:0 dropped:0 overruns:0 frame:0
|
32
|
+
TX packets:32717 errors:0 dropped:0 overruns:0 carrier:0
|
33
|
+
collisions:0 txqueuelen:0
|
34
|
+
RX bytes:7176805 (7.1 MB) TX bytes:7176805 (7.1 MB)
|
35
|
+
|
36
|
+
vmnet1 Link encap:Ethernet HWaddr 7a:67:23:e6:6c:90
|
37
|
+
inet addr:172.16.66.1 Bcast:192.168.122.255 Mask:255.255.255.0
|
38
|
+
inet6 addr: fe80::7867:23ff:fee6:6c90/64 Scope:Link
|
39
|
+
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
|
40
|
+
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
|
41
|
+
TX packets:21412 errors:0 dropped:0 overruns:0 carrier:0
|
42
|
+
collisions:0 txqueuelen:0
|
43
|
+
RX bytes:0 (0.0 B) TX bytes:1435979 (1.4 MB)
|
44
|
+
|
45
|
+
wlan0 Link encap:Ethernet HWaddr 00:15:af:0d:f6:36
|
46
|
+
inet6 addr: fe80::215:afff:fe0d:f636/64 Scope:Link
|
47
|
+
UP BROADCAST MULTICAST MTU:1500 Metric:1
|
48
|
+
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
|
49
|
+
TX packets:18 errors:0 dropped:0 overruns:0 carrier:0
|
50
|
+
collisions:0 txqueuelen:1000
|
51
|
+
RX bytes:1356 (1.3 KB) TX bytes:2412 (2.4 KB)
|
52
|
+
|
53
|
+
wmaster0 Link encap:UNSPEC HWaddr 00-15-AF-0D-F6-36-00-00-00-00-00-00-00-00-00-00
|
54
|
+
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
|
55
|
+
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
|
56
|
+
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
|
57
|
+
collisions:0 txqueuelen:1000
|
58
|
+
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: auser-columbus
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ari Lerner
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-05-18 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description:
|
17
|
+
email: arilerner@mac.com
|
18
|
+
executables:
|
19
|
+
- columbus
|
20
|
+
- columbus-client
|
21
|
+
- columbus-server
|
22
|
+
extensions: []
|
23
|
+
|
24
|
+
extra_rdoc_files:
|
25
|
+
- README.rdoc
|
26
|
+
- LICENSE
|
27
|
+
files:
|
28
|
+
- README.rdoc
|
29
|
+
- VERSION.yml
|
30
|
+
- bin/columbus
|
31
|
+
- bin/columbus-client
|
32
|
+
- bin/columbus-server
|
33
|
+
- lib/columbus
|
34
|
+
- lib/columbus/client.rb
|
35
|
+
- lib/columbus/server.rb
|
36
|
+
- lib/columbus.rb
|
37
|
+
- test/columbus_client_test.rb
|
38
|
+
- test/columbus_server_test.rb
|
39
|
+
- test/fixtures
|
40
|
+
- test/fixtures/ifconfig-mac
|
41
|
+
- test/fixtures/ifconfig-vmware
|
42
|
+
- test/test_helper.rb
|
43
|
+
- LICENSE
|
44
|
+
has_rdoc: true
|
45
|
+
homepage: http://github.com/auser/columbus
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options:
|
48
|
+
- --inline-source
|
49
|
+
- --charset=UTF-8
|
50
|
+
require_paths:
|
51
|
+
- lib
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: "0"
|
57
|
+
version:
|
58
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: "0"
|
63
|
+
version:
|
64
|
+
requirements: []
|
65
|
+
|
66
|
+
rubyforge_project:
|
67
|
+
rubygems_version: 1.2.0
|
68
|
+
signing_key:
|
69
|
+
specification_version: 3
|
70
|
+
summary: TODO
|
71
|
+
test_files: []
|
72
|
+
|