pangdudu-robots 0.1.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/README.rdoc +27 -0
- data/bin/robots +2 -0
- data/config/org.robots.service.conf +33 -0
- data/lib/robots.rb +36 -0
- data/lib/robots_agent.rb +203 -0
- data/lib/robots_infrastructure.rb +52 -0
- metadata +67 -0
data/README.rdoc
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
= ROBOTS
|
2
|
+
|
3
|
+
Start your clocks boys and girls, it's weekend coding time!
|
4
|
+
|
5
|
+
On monday I want: working messaging, data-mapper/mysql memory agent, visualizer agent with agent introspection, slim agent that requests modules,classes over the net and evals them online.
|
6
|
+
|
7
|
+
Let's try to built a nice easy to use multiagent framework
|
8
|
+
based on all the cool stuff we can get for ruby.
|
9
|
+
|
10
|
+
rObOts!
|
11
|
+
|
12
|
+
== Installation
|
13
|
+
|
14
|
+
sudo apt-get install avahi-daemon avahi-utils libavahi-client-dev libavahi-common-dev libavahi-compat-libdnssd-dev libnss-mdns libdbus-1-dev libdbus-glib-1-dev
|
15
|
+
sudo gem install dnssd
|
16
|
+
sudo gem install pangdudu-ruby-dbus --source=http://gems.github.com
|
17
|
+
sudo gem install pangdudu-rofl --source=http://gems.github.com
|
18
|
+
|
19
|
+
== Usage
|
20
|
+
|
21
|
+
== Rule the universe!
|
22
|
+
|
23
|
+
Robots are coming!
|
24
|
+
|
25
|
+
== License
|
26
|
+
|
27
|
+
GPL -> http://www.gnu.org/licenses/gpl.txt
|
data/bin/robots
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
|
2
|
+
<!-- place this file under /etc/dbus-1/system.d/ -->
|
3
|
+
<busconfig>
|
4
|
+
<policy user="root">
|
5
|
+
<allow own="org.robots.Service" />
|
6
|
+
<allow own="org.ruby.Service" />
|
7
|
+
</policy>
|
8
|
+
<policy group="netdev">
|
9
|
+
<allow own="org.robots.Service" />
|
10
|
+
<allow own="org.ruby.Service" />
|
11
|
+
</policy>
|
12
|
+
<policy group="robots">
|
13
|
+
<allow own="org.robots.Service" />
|
14
|
+
<allow own="org.ruby.Service" />
|
15
|
+
</policy>
|
16
|
+
<policy at_console="true">
|
17
|
+
<allow own="org.robots.Service" />
|
18
|
+
<allow own="org.ruby.Service" />
|
19
|
+
</policy>
|
20
|
+
<policy context="default">
|
21
|
+
<allow send_destination="org.robots.Service"/>
|
22
|
+
<allow receive_sender="org.robots.Service"/>
|
23
|
+
<allow send_destination="org.ruby.Service"/>
|
24
|
+
<allow receive_sender="org.ruby.Service"/>
|
25
|
+
<allow send_destination="org.robots.Service" send_interface="org.robots.Service.EmitterInterface" />
|
26
|
+
<allow send_destination="org.robots.Service" send_interface="org.robots.Service.SampleInterface" />
|
27
|
+
<allow send_destination="org.ruby.Service" send_interface="org.ruby.SampleInterface" />
|
28
|
+
<!-- introspection is allowed -->
|
29
|
+
<allow send_destination="org.robots.Service" send_interface="org.freedesktop.DBus.Introspectable" />
|
30
|
+
<allow send_destination="org.ruby.Service" send_interface="org.freedesktop.DBus.Introspectable" />
|
31
|
+
</policy>
|
32
|
+
</busconfig>
|
33
|
+
|
data/lib/robots.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rofl' #gem install pangdudu-rofl --source=http://gems.github.com
|
3
|
+
#local requires, actually don't need them, just to let you know whats going on
|
4
|
+
require 'robots_agent'
|
5
|
+
|
6
|
+
module Robots
|
7
|
+
|
8
|
+
attr_accessor :robotsagent,:haz_robots
|
9
|
+
|
10
|
+
#release the robots
|
11
|
+
def release_robots
|
12
|
+
check_robotsagent
|
13
|
+
end
|
14
|
+
|
15
|
+
#receives messages from the robots, should be overwritten in the implementing class
|
16
|
+
def receive_msg msg
|
17
|
+
ilog msg
|
18
|
+
end
|
19
|
+
|
20
|
+
#sends messages to the robots, should be overwritten in the implementing class
|
21
|
+
def send_msg msg
|
22
|
+
@robotsagent.send_msg msg if @haz_robots
|
23
|
+
end
|
24
|
+
|
25
|
+
#check if robots are set up
|
26
|
+
def check_robotsagent
|
27
|
+
@haz_robots = @robotsagent.nil?
|
28
|
+
if @haz_robots
|
29
|
+
@robotsagent = Robot.new
|
30
|
+
@robotsagent.run
|
31
|
+
@robotsagent.add_listener self
|
32
|
+
end
|
33
|
+
return @haz_robots
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
data/lib/robots_agent.rb
ADDED
@@ -0,0 +1,203 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'dbus' #gem install sdague-ruby-dbus --source=http://gems.github.com
|
3
|
+
require 'rofl' #gem install pangdudu-rofl --source=http://gems.github.com
|
4
|
+
#local requires, actually don't need them, just to let you know whats going on
|
5
|
+
require 'robots_infrastructure'
|
6
|
+
|
7
|
+
class Robot
|
8
|
+
attr_accessor :avahi
|
9
|
+
attr_accessor :emitters,:infrastructure,:listeners
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
dlog "new Robot initialized."
|
13
|
+
@robotsservice = "org.robots.Service"
|
14
|
+
@emitterpath = "/org/robots/Service/Emitter"
|
15
|
+
@emitterinterface = "org.ruby.Service.EmitterInterface"
|
16
|
+
@coreservice = nil
|
17
|
+
@listeners = [] # listeners for incoming messages are here
|
18
|
+
@emitters = {} #holds emitters we use
|
19
|
+
@infrastructure = {} #holds infrastructure objects
|
20
|
+
@servicetypes = fill_servicetypes
|
21
|
+
end
|
22
|
+
|
23
|
+
#start the mojo
|
24
|
+
def run
|
25
|
+
setup_robots_service
|
26
|
+
register_callbacks
|
27
|
+
#test_messages; #main_loop;
|
28
|
+
end
|
29
|
+
|
30
|
+
#setup the robots service
|
31
|
+
def setup_robots_service
|
32
|
+
robots_running = running? @robotsservice
|
33
|
+
dlog "robots service has already been started." if robots_running
|
34
|
+
unless robots_running
|
35
|
+
ilog "will now setup robots service infrastructure."
|
36
|
+
start_core_service @robotsservice
|
37
|
+
init_robots_infrastructure
|
38
|
+
end
|
39
|
+
get_robots_infrastructure
|
40
|
+
end
|
41
|
+
|
42
|
+
#ROBOTS SERVICE INIT START
|
43
|
+
|
44
|
+
=begin
|
45
|
+
the following methods are only called, if the robots service is not already running
|
46
|
+
=end
|
47
|
+
|
48
|
+
#setup the infrastructure objects for communication
|
49
|
+
def init_robots_infrastructure
|
50
|
+
emitter = Emitter.new(@emitterpath,self)
|
51
|
+
@coreservice.export(emitter)
|
52
|
+
@infrastructure["emitter"] = emitter
|
53
|
+
end
|
54
|
+
|
55
|
+
#get instances of our infrastructure objects
|
56
|
+
def get_robots_infrastructure
|
57
|
+
emitter = get_object_from_service @robotsservice,@emitterpath,@emitterinterface
|
58
|
+
@emitters["robots"] = emitter
|
59
|
+
end
|
60
|
+
|
61
|
+
#start a service
|
62
|
+
def start_core_service service_name=@robotsservice
|
63
|
+
bus = DBus::system_bus
|
64
|
+
#first of all check if the service we want to launch is already started
|
65
|
+
dlog "skipping service: #{service_name} has already been started." if running? service_name
|
66
|
+
unless running? service_name
|
67
|
+
begin
|
68
|
+
@coreservice = bus.request_service(service_name)
|
69
|
+
rescue
|
70
|
+
elog "service request for #{service_name} denied."
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
#ROBOTS SERVICE INIT END
|
76
|
+
|
77
|
+
#get a dbus object from a service
|
78
|
+
def get_object_from_service service_name,obj_path,default_iface
|
79
|
+
begin
|
80
|
+
if running? service_name
|
81
|
+
bus = DBus::system_bus
|
82
|
+
ruby_service = bus.service(service_name)
|
83
|
+
obj = ruby_service.object(obj_path)
|
84
|
+
obj.introspect
|
85
|
+
obj.default_iface = default_iface
|
86
|
+
return obj
|
87
|
+
end
|
88
|
+
return nil
|
89
|
+
rescue
|
90
|
+
elog "could not get object:#{obj_path} from service: #{service_name}"
|
91
|
+
return nil
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
#register callback methods
|
96
|
+
def register_callbacks
|
97
|
+
bus = DBus::system_bus
|
98
|
+
#setup callbacks for infrastructure emitters
|
99
|
+
@emitters.each { |name,emitter| register_emitter_callback name,emitter }
|
100
|
+
#setup service browser
|
101
|
+
proxy = bus.introspect("org.freedesktop.Avahi","/")
|
102
|
+
@avahi = proxy["org.freedesktop.Avahi.Server"]
|
103
|
+
@servicetypes.each { |name,type| register_service_callback name,type }
|
104
|
+
end
|
105
|
+
|
106
|
+
#register an emitter callback
|
107
|
+
def register_emitter_callback name,emitter
|
108
|
+
bus = DBus::system_bus
|
109
|
+
dlog "registering callback for #{name} on path #{emitter.path}"
|
110
|
+
mr = DBus::MatchRule.new
|
111
|
+
mr.type = "signal"
|
112
|
+
mr.interface = "org.ruby.Service.EmitterInterface"
|
113
|
+
mr.path = emitter.path
|
114
|
+
bus.add_match(mr) { |msg| emitter_proxy_callback msg }
|
115
|
+
end
|
116
|
+
|
117
|
+
#get called when receiving an remote emitter message
|
118
|
+
def emitter_proxy_callback msg
|
119
|
+
@listeners.each { |l| l.receive_msg msg.params[0] } unless msg.params[0].nil?
|
120
|
+
end
|
121
|
+
|
122
|
+
#gets called from the exported emitter object
|
123
|
+
def emitter_callback msg
|
124
|
+
#when other agents use the send_message of the proxy, it will only reach the
|
125
|
+
#local non proxy object, so we need to emit a signal and tell everyone
|
126
|
+
@infrastructure["emitter"].newMessage(msg) if @infrastructure.has_key? "emitter"
|
127
|
+
end
|
128
|
+
|
129
|
+
#builds a service type specific callback
|
130
|
+
def register_service_callback name,type
|
131
|
+
bus = DBus::system_bus
|
132
|
+
sb = @avahi.ServiceBrowserNew(-1,-1,"_#{type}._tcp","local",0)
|
133
|
+
#now we start the match rule definition
|
134
|
+
mr = DBus::MatchRule.new
|
135
|
+
mr.type = "signal"
|
136
|
+
mr.interface = "org.freedesktop.Avahi.ServiceBrowser"
|
137
|
+
mr.path = sb.first
|
138
|
+
bus.add_match(mr) { |msg| service_callback name,msg }
|
139
|
+
end
|
140
|
+
|
141
|
+
#gets called on a service change
|
142
|
+
def service_callback name,msg
|
143
|
+
if msg.member.eql? "ItemNew"
|
144
|
+
dlog "new #{name}: #{msg.params[2]}"
|
145
|
+
end
|
146
|
+
if msg.member.eql? "ItemRemoved"
|
147
|
+
dlog "removed #{name}: #{msg.params[2]}"
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
#check if a service is running
|
152
|
+
def running? service_name
|
153
|
+
bus = DBus::system_bus
|
154
|
+
return bus.proxy.ListNames[0].include? service_name
|
155
|
+
end
|
156
|
+
|
157
|
+
#functions used by the module
|
158
|
+
|
159
|
+
#send
|
160
|
+
def send_msg msg
|
161
|
+
@emitters["robots"].send_message(msg) unless @emitters["robots"].nil?
|
162
|
+
end
|
163
|
+
|
164
|
+
#add a listener
|
165
|
+
def add_listener listener
|
166
|
+
#check if the method is implemented
|
167
|
+
impcheck = defined? listener.receive_msg
|
168
|
+
#if it is add to listeners
|
169
|
+
@listeners << listener if impcheck.eql? "method"
|
170
|
+
#if not inform dev
|
171
|
+
unless impcheck.eql? "method"
|
172
|
+
elog "Method 'receive_msg string' needs to be implemented! Example:"
|
173
|
+
puts "def receive_msg msg\n puts msg\nend"
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
#functions used by the module end here
|
178
|
+
|
179
|
+
#dbus main loop
|
180
|
+
def main_loop
|
181
|
+
dlog "going into main loop..."
|
182
|
+
loop do
|
183
|
+
sleep 1
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
def test_messages
|
188
|
+
Thread.new do
|
189
|
+
loop do
|
190
|
+
msg = "it worx from alpha!"
|
191
|
+
send_msg msg
|
192
|
+
sleep 1
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
#list names of a proxy object
|
198
|
+
def list_names proxy=@dbus.proxy
|
199
|
+
dlog "listnames:"
|
200
|
+
proxy.ListNames[0].each { |name| dlog name }
|
201
|
+
@services.each { |name,service| dlog "service introspection for #{name} introspection: #{service.introspect}" }
|
202
|
+
end
|
203
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
=begin
|
2
|
+
this includes all the necessary dbus objects we need for the robots infrastructure
|
3
|
+
=end
|
4
|
+
require 'rubygems'
|
5
|
+
require 'dbus' #gem install sdague-ruby-dbus --source=http://gems.github.com
|
6
|
+
require 'rofl' #gem install pangdudu-rofl --source=http://gems.github.com
|
7
|
+
|
8
|
+
#basic emitter class
|
9
|
+
class Emitter < DBus::Object
|
10
|
+
|
11
|
+
attr_accessor :listener
|
12
|
+
|
13
|
+
def initialize path,listener
|
14
|
+
super path
|
15
|
+
@listener = listener
|
16
|
+
dlog "new Emitter initialized at #{path}"
|
17
|
+
end
|
18
|
+
|
19
|
+
#create an dbus interface
|
20
|
+
dbus_interface "org.ruby.Service.EmitterInterface" do
|
21
|
+
#creates a signal in the interface:
|
22
|
+
dbus_signal :newMessage, "msgbody:s"
|
23
|
+
#creates an emit method in the interface:
|
24
|
+
dbus_method :send_message, "in msg:s" do |msg|
|
25
|
+
send_message_callback msg
|
26
|
+
end
|
27
|
+
end #end of the dbus interface
|
28
|
+
|
29
|
+
#this method gets called by remote proxy objects calling send_message
|
30
|
+
def send_message_callback msg
|
31
|
+
@listener.emitter_callback msg
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
#hardcoding i don't want in the agent file
|
37
|
+
def fill_servicetypes
|
38
|
+
types = {}
|
39
|
+
types["Workstation"] = "workstation"
|
40
|
+
types["SSH Remote Terminal"] = "ssh"
|
41
|
+
types["Website"] = "http"
|
42
|
+
types["Secure Website"] = "https"
|
43
|
+
types["iChat Presence"] = "presence"
|
44
|
+
types["PulseAudio Sound Server"] = "pulse-server"
|
45
|
+
types["Subversion Revision Control"] = "svn"
|
46
|
+
types["GIT"] = "git"
|
47
|
+
types["APT Package Repository"] = "apt"
|
48
|
+
types["WebDAV"] = "webdav"
|
49
|
+
types["Secure WebDAV"] = "webdavs"
|
50
|
+
types["Samba"] = "smb"
|
51
|
+
return types
|
52
|
+
end
|
metadata
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pangdudu-robots
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- pangdudu
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-07-17 00:00:00 -07:00
|
13
|
+
default_executable: robots
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: dbus
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
description: robots!
|
26
|
+
email: pangdudu@github
|
27
|
+
executables:
|
28
|
+
- robots
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files:
|
32
|
+
- README.rdoc
|
33
|
+
files:
|
34
|
+
- README.rdoc
|
35
|
+
- bin/robots
|
36
|
+
- lib/robots.rb
|
37
|
+
- lib/robots_agent.rb
|
38
|
+
- lib/robots_infrastructure.rb
|
39
|
+
- config/org.robots.service.conf
|
40
|
+
has_rdoc: true
|
41
|
+
homepage: http://github.com/pangdudu/robots
|
42
|
+
post_install_message:
|
43
|
+
rdoc_options: []
|
44
|
+
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: "0"
|
52
|
+
version:
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: "0"
|
58
|
+
version:
|
59
|
+
requirements: []
|
60
|
+
|
61
|
+
rubyforge_project: http://github.com/pangdudu/robots
|
62
|
+
rubygems_version: 1.2.0
|
63
|
+
signing_key:
|
64
|
+
specification_version: 2
|
65
|
+
summary: more robots!
|
66
|
+
test_files: []
|
67
|
+
|