Class: Arpoon
- Inherits:
-
Object
show all
- Includes:
- Singleton
- Defined in:
- lib/arpoon/version.rb,
lib/arpoon.rb,
lib/arpoon/route.rb,
lib/arpoon/table.rb,
lib/arpoon/client.rb,
lib/arpoon/packet.rb,
lib/arpoon/interface.rb,
lib/arpoon/controller.rb
Overview
--
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- You just DO WHAT THE FUCK YOU WANT TO.
++
Defined Under Namespace
Classes: Client, Controller, Interface, Packet, Route, Table
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize ⇒ Arpoon
Returns a new instance of Arpoon.
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
# File 'lib/arpoon.rb', line 30
def initialize
@commands = {}
@connections = []
@interfaces = {}
@any = []
reload_table!
any {
on :packet do |packet|
if packet.request?
packet.interface.fire :request, packet, packet.interface
else
packet.interface.fire :reply, packet, packet.interface
end
if packet.destination.broadcast?
packet.interface.fire :broadcast, packet, packet.interface
end
end
}
controller_at '/var/run/arpoon.ctl'
logs_at '/var/log/arpoon.log'
end
|
Instance Attribute Details
#interfaces ⇒ Object
Returns the value of attribute interfaces.
28
29
30
|
# File 'lib/arpoon.rb', line 28
def interfaces
@interfaces
end
|
Class Method Details
.method_missing(*args, &block) ⇒ Object
24
25
26
|
# File 'lib/arpoon.rb', line 24
def self.method_missing (*args, &block)
instance.__send__ *args, &block
end
|
.version ⇒ Object
12
13
14
|
# File 'lib/arpoon/version.rb', line 12
def self.version
'0.0.1.1'
end
|
Instance Method Details
#any(&block) ⇒ Object
184
185
186
187
188
189
190
|
# File 'lib/arpoon.rb', line 184
def any (&block)
@interfaces.each_value {|interface|
interface.load(&block)
}
@any << block
end
|
#broadcast(*args) ⇒ Object
146
147
148
149
150
|
# File 'lib/arpoon.rb', line 146
def broadcast (*args)
@connections.each {|conn|
conn.send_response(*args)
}
end
|
#command(*args, &block) ⇒ Object
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
# File 'lib/arpoon.rb', line 152
def command (*args, &block)
if block
command = args.first.to_sym
@commands[command] = block
else
controller = args.shift
command = args.shift
controller.instance_exec *args, &@commands[command.to_sym]
end
rescue Exception => e
log e, "command: #{command}"
end
|
#connected(controller) ⇒ Object
138
139
140
|
# File 'lib/arpoon.rb', line 138
def connected (controller)
@connections << controller
end
|
#controller_at(path) ⇒ Object
56
57
58
|
# File 'lib/arpoon.rb', line 56
def controller_at (path)
@controller_at = File.expand_path(path)
end
|
#disconnected(controller) ⇒ Object
142
143
144
|
# File 'lib/arpoon.rb', line 142
def disconnected (controller)
@connections.delete(controller)
end
|
#interface(name, &block) ⇒ Object
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
|
# File 'lib/arpoon.rb', line 167
def interface (name, &block)
unless @interfaces.member? name
@interfaces[name] = Interface.new(name)
@any.each {|block|
@interfaces[name].load(&block)
}
EM.schedule {
@interfaces[name].start if started?
}
end
@interfaces[name].load(&block) if block
@interfaces[name]
end
|
#load(path = nil, &block) ⇒ Object
128
129
130
131
132
133
134
135
136
|
# File 'lib/arpoon.rb', line 128
def load (path = nil, &block)
if path
instance_eval File.read(File.expand_path(path)), path, 1
else
instance_exec &block
end
self
end
|
#log(what, group = nil) ⇒ Object
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
# File 'lib/arpoon.rb', line 65
def log (what, group = nil)
io = StringIO.new
io.print "[#{Time.now}#{", #{group}" if group}] "
if what.is_a? Exception
io.puts "#{what.class.name}: #{what.message}"
io.puts what.backtrace
else
io.puts what
end
io.string.tap {|text|
$stderr.puts text
File.open(@logs_at, 'a') { |f| f.print text }
}
end
|
#logs_at(path) ⇒ Object
60
61
62
|
# File 'lib/arpoon.rb', line 60
def logs_at (path)
@logs_at = File.expand_path(path)
end
|
#reload_table! ⇒ Object
120
121
122
|
# File 'lib/arpoon.rb', line 120
def reload_table!
@table = Table.new
end
|
#route ⇒ Object
124
125
126
|
# File 'lib/arpoon.rb', line 124
def route
Route.new
end
|
#start ⇒ Object
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
# File 'lib/arpoon.rb', line 84
def start
return if started?
@started = true
@interfaces.each_value {|interface|
interface.start
}
File.umask(0).tap {|old|
begin
@signature = EM.start_server(@controller_at, Controller)
ensure
File.umask(old)
end
}
end
|
#started? ⇒ Boolean
63
|
# File 'lib/arpoon.rb', line 63
def started?; @started; end
|
#stop ⇒ Object
102
103
104
105
106
107
108
109
110
111
112
113
114
|
# File 'lib/arpoon.rb', line 102
def stop
return unless started?
@interfaces.each_value {|interface|
interface.stop
}
if @signature
EM.stop_server @signature
end
@started = false
end
|
#table ⇒ Object
116
117
118
|
# File 'lib/arpoon.rb', line 116
def table
@table || reload_table!
end
|