cirrocumulus 0.6.3 → 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/README.rdoc +1 -22
  2. data/lib/cirrocumulus.rb +8 -2
  3. data/lib/cirrocumulus/{message.rb → agents/message.rb} +0 -0
  4. data/lib/cirrocumulus/channels.rb +129 -0
  5. data/lib/cirrocumulus/channels/jabber.rb +168 -0
  6. data/lib/cirrocumulus/environment.rb +46 -0
  7. data/lib/cirrocumulus/facts.rb +135 -0
  8. data/lib/cirrocumulus/identifier.rb +84 -0
  9. data/lib/cirrocumulus/ontology.rb +333 -49
  10. data/lib/cirrocumulus/pattern_matching.rb +175 -0
  11. data/lib/cirrocumulus/remote_console.rb +29 -0
  12. data/lib/cirrocumulus/rule_queue.rb +69 -0
  13. data/lib/cirrocumulus/rules/engine.rb +7 -5
  14. data/lib/cirrocumulus/rules/fact.rb +22 -0
  15. data/lib/cirrocumulus/rules/pattern_matcher.rb +19 -0
  16. data/lib/cirrocumulus/rules/run_queue.rb +1 -0
  17. data/lib/cirrocumulus/saga.rb +44 -25
  18. data/lib/console.rb +96 -0
  19. metadata +79 -72
  20. data/.document +0 -5
  21. data/.idea/.name +0 -1
  22. data/.idea/.rakeTasks +0 -7
  23. data/.idea/cirrocumulus.iml +0 -87
  24. data/.idea/encodings.xml +0 -5
  25. data/.idea/misc.xml +0 -5
  26. data/.idea/modules.xml +0 -9
  27. data/.idea/scopes/scope_settings.xml +0 -5
  28. data/.idea/vcs.xml +0 -7
  29. data/.idea/workspace.xml +0 -614
  30. data/Gemfile +0 -18
  31. data/Gemfile.lock +0 -43
  32. data/Rakefile +0 -37
  33. data/VERSION +0 -1
  34. data/cirrocumulus.gemspec +0 -106
  35. data/lib/.gitignore +0 -5
  36. data/lib/cirrocumulus/agent_wrapper.rb +0 -67
  37. data/lib/cirrocumulus/jabber_bus.rb +0 -140
  38. data/lib/cirrocumulus/rule_engine.rb +0 -2
  39. data/lib/cirrocumulus/rule_server.rb +0 -49
  40. data/test/Gemfile +0 -3
  41. data/test/Gemfile.lock +0 -27
  42. data/test/helper.rb +0 -18
  43. data/test/test.rb +0 -85
  44. data/test/test2.rb +0 -30
  45. data/test/test_cirrocumulus.rb +0 -7
data/Gemfile DELETED
@@ -1,18 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- gem "activesupport", "~> 2.3.11"
4
- gem "log4r", "~> 1.1.9"
5
- gem "systemu"
6
- gem "xmpp4r", "~> 0.5"
7
- gem "xmpp4r-simple", :git => 'git://github.com/blaine/xmpp4r-simple.git'
8
- gem "eventmachine"
9
- gem "deil_sexpistol", :require => "sexpistol"
10
- gem 'guid'
11
-
12
- group :development do
13
- #gem "shoulda", ">= 0"
14
- gem "rdoc", "~> 3.12"
15
- gem "bundler", "~> 1.0.0"
16
- gem "jeweler", "~> 1.8.3"
17
- #gem "simplecov", ">= 0"
18
- end
@@ -1,43 +0,0 @@
1
- GIT
2
- remote: git://github.com/blaine/xmpp4r-simple.git
3
- revision: 92e2cd0002ec3a9a38506527e1a3a2d622408626
4
- specs:
5
- xmpp4r-simple (0.8.8)
6
- xmpp4r (>= 0.3.2)
7
-
8
- GEM
9
- remote: http://rubygems.org/
10
- specs:
11
- activesupport (2.3.14)
12
- deil_sexpistol (0.0.8)
13
- eventmachine (0.12.10)
14
- git (1.2.5)
15
- guid (0.1.1)
16
- jeweler (1.8.3)
17
- bundler (~> 1.0)
18
- git (>= 1.2.5)
19
- rake
20
- rdoc
21
- json (1.6.5)
22
- log4r (1.1.10)
23
- rake (0.9.2.2)
24
- rdoc (3.12)
25
- json (~> 1.4)
26
- systemu (2.4.2)
27
- xmpp4r (0.5)
28
-
29
- PLATFORMS
30
- ruby
31
-
32
- DEPENDENCIES
33
- activesupport (~> 2.3.11)
34
- bundler (~> 1.0.0)
35
- deil_sexpistol
36
- eventmachine
37
- guid
38
- jeweler (~> 1.8.3)
39
- log4r (~> 1.1.9)
40
- rdoc (~> 3.12)
41
- systemu
42
- xmpp4r (~> 0.5)
43
- xmpp4r-simple!
data/Rakefile DELETED
@@ -1,37 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'rubygems'
4
- require 'bundler'
5
- begin
6
- Bundler.setup(:default, :development)
7
- rescue Bundler::BundlerError => e
8
- $stderr.puts e.message
9
- $stderr.puts "Run `bundle install` to install missing gems"
10
- exit e.status_code
11
- end
12
- require 'rake'
13
-
14
- require 'jeweler'
15
- Jeweler::Tasks.new do |gem|
16
- # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
- gem.name = "cirrocumulus"
18
- gem.homepage = "http://github.com/deil/cirrocumulus"
19
- gem.license = "GPL-2"
20
- gem.summary = "Agent-based infrastructure management system"
21
- gem.description = "Engine for building your own agents, providing you base functionality for loading ontologies, communicating with other agents and parsing FIPA-ACL messages"
22
- gem.email = "deil@mneko.net"
23
- gem.authors = ["Anton Kosyakin"]
24
- gem.required_ruby_version = '>= 1.9.2'
25
- # dependencies defined in Gemfile
26
- end
27
- Jeweler::RubygemsDotOrgTasks.new
28
-
29
- require 'rdoc/task'
30
- Rake::RDocTask.new do |rdoc|
31
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
32
-
33
- rdoc.rdoc_dir = 'rdoc'
34
- rdoc.title = "cirrocumulus #{version}"
35
- rdoc.rdoc_files.include('README*')
36
- rdoc.rdoc_files.include('lib/**/*.rb')
37
- end
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.6.3
@@ -1,106 +0,0 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
5
-
6
- Gem::Specification.new do |s|
7
- s.name = "cirrocumulus"
8
- s.version = "0.6.3"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Anton Kosyakin"]
12
- s.date = "2012-05-23"
13
- s.description = "Engine for building your own agents, providing you base functionality for loading ontologies, communicating with other agents and parsing FIPA-ACL messages"
14
- s.email = "deil@mneko.net"
15
- s.extra_rdoc_files = [
16
- "LICENSE.txt",
17
- "README.rdoc"
18
- ]
19
- s.files = [
20
- ".document",
21
- ".idea/.name",
22
- ".idea/.rakeTasks",
23
- ".idea/cirrocumulus.iml",
24
- ".idea/encodings.xml",
25
- ".idea/misc.xml",
26
- ".idea/modules.xml",
27
- ".idea/scopes/scope_settings.xml",
28
- ".idea/vcs.xml",
29
- ".idea/workspace.xml",
30
- "Gemfile",
31
- "Gemfile.lock",
32
- "LICENSE.txt",
33
- "README.rdoc",
34
- "Rakefile",
35
- "VERSION",
36
- "cirrocumulus.gemspec",
37
- "lib/.gitignore",
38
- "lib/cirrocumulus.rb",
39
- "lib/cirrocumulus/agent.rb",
40
- "lib/cirrocumulus/agent_wrapper.rb",
41
- "lib/cirrocumulus/jabber_bus.rb",
42
- "lib/cirrocumulus/logger.rb",
43
- "lib/cirrocumulus/message.rb",
44
- "lib/cirrocumulus/ontology.rb",
45
- "lib/cirrocumulus/rule_engine.rb",
46
- "lib/cirrocumulus/rule_server.rb",
47
- "lib/cirrocumulus/rules/engine.rb",
48
- "lib/cirrocumulus/rules/run_queue.rb",
49
- "lib/cirrocumulus/saga.rb",
50
- "test/Gemfile",
51
- "test/Gemfile.lock",
52
- "test/helper.rb",
53
- "test/test.rb",
54
- "test/test2.rb",
55
- "test/test_cirrocumulus.rb"
56
- ]
57
- s.homepage = "http://github.com/deil/cirrocumulus"
58
- s.licenses = ["GPL-2"]
59
- s.require_paths = ["lib"]
60
- s.required_ruby_version = Gem::Requirement.new(">= 1.9.2")
61
- s.rubygems_version = "1.8.10"
62
- s.summary = "Agent-based infrastructure management system"
63
-
64
- if s.respond_to? :specification_version then
65
- s.specification_version = 3
66
-
67
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
68
- s.add_runtime_dependency(%q<activesupport>, ["~> 2.3.11"])
69
- s.add_runtime_dependency(%q<log4r>, ["~> 1.1.9"])
70
- s.add_runtime_dependency(%q<systemu>, [">= 0"])
71
- s.add_runtime_dependency(%q<xmpp4r>, ["~> 0.5"])
72
- s.add_runtime_dependency(%q<xmpp4r-simple>, [">= 0"])
73
- s.add_runtime_dependency(%q<eventmachine>, [">= 0"])
74
- s.add_runtime_dependency(%q<deil_sexpistol>, [">= 0"])
75
- s.add_runtime_dependency(%q<guid>, [">= 0"])
76
- s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
77
- s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
78
- s.add_development_dependency(%q<jeweler>, ["~> 1.8.3"])
79
- else
80
- s.add_dependency(%q<activesupport>, ["~> 2.3.11"])
81
- s.add_dependency(%q<log4r>, ["~> 1.1.9"])
82
- s.add_dependency(%q<systemu>, [">= 0"])
83
- s.add_dependency(%q<xmpp4r>, ["~> 0.5"])
84
- s.add_dependency(%q<xmpp4r-simple>, [">= 0"])
85
- s.add_dependency(%q<eventmachine>, [">= 0"])
86
- s.add_dependency(%q<deil_sexpistol>, [">= 0"])
87
- s.add_dependency(%q<guid>, [">= 0"])
88
- s.add_dependency(%q<rdoc>, ["~> 3.12"])
89
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
90
- s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
91
- end
92
- else
93
- s.add_dependency(%q<activesupport>, ["~> 2.3.11"])
94
- s.add_dependency(%q<log4r>, ["~> 1.1.9"])
95
- s.add_dependency(%q<systemu>, [">= 0"])
96
- s.add_dependency(%q<xmpp4r>, ["~> 0.5"])
97
- s.add_dependency(%q<xmpp4r-simple>, [">= 0"])
98
- s.add_dependency(%q<eventmachine>, [">= 0"])
99
- s.add_dependency(%q<deil_sexpistol>, [">= 0"])
100
- s.add_dependency(%q<guid>, [">= 0"])
101
- s.add_dependency(%q<rdoc>, ["~> 3.12"])
102
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
103
- s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
104
- end
105
- end
106
-
@@ -1,5 +0,0 @@
1
- config/*
2
- ontologies/*
3
- standalone/*
4
- agent.rb
5
- *.log
@@ -1,67 +0,0 @@
1
- unless Kernel.respond_to?(:require_relative)
2
- module Kernel
3
- def require_relative(path)
4
- require File.join(File.dirname(caller[0]), path.to_str)
5
- end
6
- end
7
- end
8
-
9
- require 'yaml'
10
- require 'cirrocumulus'
11
- require 'cirrocumulus/logger'
12
- require 'cirrocumulus/ontology'
13
- require 'cirrocumulus/agent'
14
-
15
- class String
16
- def underscore
17
- self.gsub(/::/, '/').
18
- gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
19
- gsub(/([a-z\d])([A-Z])/,'\1_\2').
20
- tr("-", "_").
21
- downcase
22
- end
23
- end
24
-
25
- ontologies_file_name = nil
26
-
27
- ARGV.each_with_index do |arg, i|
28
- if arg == '-c'
29
- ontologies_file_name = ARGV[i + 1]
30
- end
31
- end
32
-
33
- if ontologies_file_name.nil?
34
- puts "Please supply config file name"
35
- exit(0)
36
- end
37
-
38
- puts "Loading configuration.."
39
- agent_config = YAML.load_file(ontologies_file_name)
40
- ontologies = agent_config['ontologies']
41
- ontologies.each do |ontology_name|
42
- puts "Will load ontology %s" % ontology_name
43
- require File.join(AGENT_ROOT, 'ontologies', ontology_name.underscore)
44
- end
45
-
46
- =begin
47
- kb_name = agent_config['kb']
48
- kb = if kb_name
49
- puts "Will load knowledge base %s" % kb_name
50
- require File.join(AGENT_ROOT, 'ontologies/xen/', kb_name.underscore) # TODO
51
- eval("#{kb_name}.new()")
52
- else
53
- Kb.new
54
- end
55
- =end
56
-
57
- begin
58
- a = Agent::Base.new
59
- a.load_ontologies(agent_config['ontologies'])
60
- a.start
61
- rescue Exception => e
62
- puts 'Got an error:'
63
- puts e
64
- puts e.backtrace
65
- end
66
-
67
- puts "\nBye-bye."
@@ -1,140 +0,0 @@
1
- require 'xmpp4r'
2
- require 'xmpp4r-simple'
3
- require 'guid'
4
- require 'sexpistol'
5
- require_relative 'message'
6
-
7
- class JabberBus
8
- attr_reader :jid
9
-
10
- def initialize(jid)
11
- @jid = jid
12
- @send_queue = Queue.new
13
-
14
- Log4r::Logger['bus'].info 'will use Jabber for agent communications'
15
- end
16
-
17
- def connected?
18
- @jabber && @jabber.connected?
19
- end
20
-
21
- def connect
22
- Log4r::Logger['bus'].info "logging to #{JABBER_SERVER} as #{jid}"
23
-
24
- begin
25
- full_jid = jid + "@" + JABBER_SERVER
26
- @jabber = Jabber::Simple.new(full_jid, JABBER_DEFAULT_PASSWORD)
27
- rescue Errno::ECONNREFUSED => ex
28
- Log4r::Logger['bus'].warn 'connection refused' and return false
29
- rescue Jabber::ClientAuthenticationFailure => ex
30
- Log4r::Logger['bus'].warn 'got Jabber::ClientAuthenticationFailure'
31
- Log4r::Logger['bus'].info 'using default password to register new account'
32
-
33
- client = Jabber::Client.new(full_jid)
34
- client.connect()
35
- client.register(JABBER_DEFAULT_PASSWORD) #, {'username' => full_jid, 'password' => JABBER_DEFAULT_PASSWORD})
36
- client.close()
37
- @jabber = Jabber::Simple.new(full_jid, JABBER_DEFAULT_PASSWORD)
38
- end
39
-
40
- if connected?
41
- Log4r::Logger['bus'].info 'joining ' + JABBER_CONFERENCE
42
- @jabber.send!("<presence to='#{JABBER_CONFERENCE}/#{@jid}' />")
43
- true
44
- else
45
- false
46
- end
47
- rescue
48
- false
49
- end
50
-
51
- def start(agent)
52
- thrd = Thread.new do
53
- s = Sexpistol.new
54
- while true do
55
- begin
56
- if connected?
57
- @jabber.received_messages do |message|
58
- # <fipa-message ontology="cirrocumulus-cloud" act="inform" receiver="sapco-cloud"><content>q</content></fipa-message>
59
- next unless message.x('jabber:x:delay').nil?
60
-
61
- begin
62
- xml = Hash.from_xml(message.body)['fipa_message']
63
- content_raw = xml['content']
64
- content = s.parse_string(content_raw)
65
- acl = Cirrocumulus::Message.new(message.from.resource, xml['act'], content)
66
- acl.receiver = xml['receiver']
67
- acl.ontology = xml['ontology']
68
- acl.reply_with = xml['reply_with']
69
- acl.in_reply_to = xml['in_reply_to']
70
- acl.conversation_id = xml['conversation_id']
71
- flatten_message_content(acl)
72
-
73
- #Log4r::Logger['bus'].debug(acl.inspect)
74
- agent.process_incoming_message(acl)
75
- rescue Exception => ex
76
- p ex
77
- p ex.backtrace
78
- end
79
- end
80
-
81
- while true do
82
- message = @send_queue.pop(true) rescue nil
83
- break if message.nil?
84
-
85
- send_message_actual(message)
86
- end
87
- else
88
- sleep 5 unless connect
89
- end
90
-
91
- sleep 0.5
92
- rescue Exception => ex
93
- puts ex.to_s
94
- puts ex.backtrace.to_s
95
- end
96
- end
97
- end
98
- end
99
-
100
- def send_message(message)
101
- @send_queue << message
102
- end
103
-
104
- private
105
-
106
- def flatten_message_content(message)
107
- if !message.content.is_a?(Array)
108
- message.content = [message.content]
109
- else
110
- while message.content.is_a?(Array) && message.content.size == 1 && message.content.first.is_a?(Array)
111
- message.content = message.content.first
112
- end
113
- end
114
- end
115
-
116
- def send_message_actual(message)
117
- message_content = message.content if message.content.is_a?(String)
118
- message_content = Sexpistol.new.to_sexp(message.content) if message.content.is_a?(Array)
119
-
120
- text = '<fipa-message ontology="%s"' % message.ontology
121
- text += ' receiver="%s"' % message.receiver if message.receiver
122
- text += ' act="%s"' % message.act
123
- text += ' reply-with="%s"' % message.reply_with if message.reply_with
124
- text += ' in-reply-to="%s"' % message.in_reply_to if message.in_reply_to
125
- text += ' conversation-id="%s"' % message.conversation_id if message.conversation_id
126
- text += '><content>%s</content></fipa-message>' % message_content
127
- @jabber.send!('<message type="groupchat" to="%s" id="%s"><body>%s</body></message>' % [
128
- JABBER_CONFERENCE,
129
- Guid.new.to_s.gsub('-', ''),
130
- text.gsub('&', '&amp;').gsub('<', '&lt;').gsub('>', '&gt;').gsub('"', '&quot;')
131
- ])
132
-
133
- true
134
- rescue Exception => ex
135
- puts ex.to_s
136
- puts ex.backtrace.to_s
137
- false
138
- end
139
-
140
- end
@@ -1,2 +0,0 @@
1
- require_relative 'rules/run_queue.rb'
2
- require_relative 'rules/engine.rb'
@@ -1,49 +0,0 @@
1
- require 'eventmachine'
2
- require 'sexpistol'
3
- require 'log4r'
4
-
5
- module RuleEngine
6
- class Server < EventMachine::Connection
7
- def self.run
8
- l = Log4r::Logger.new('kb')
9
- o = Log4r::StdoutOutputter.new('console')
10
- l.outputters << o
11
-
12
- EventMachine.run do
13
- Signal.trap("INT") { EventMachine.stop }
14
- Signal.trap("TERM") { EventMachine.stop }
15
-
16
- EventMachine.start_server('127.0.0.1', 2812, self)
17
- end
18
- end
19
-
20
- attr_reader :engine
21
-
22
- def initialize()
23
- @engine = Test.new
24
- end
25
-
26
- def receive_data(data)
27
- s = Sexpistol.new
28
- sexp = s.parse_string(data)
29
- if sexp.first == :assert
30
- engine.assert get_fact(sexp)
31
- elsif sexp.first == :retract
32
- engine.retract get_fact(sexp)
33
- elsif sexp.first == :query
34
- send_data engine.query(get_fact(sexp))
35
- else
36
- puts sexp.inspect
37
- end
38
- rescue Exception => ex
39
- puts ex.to_s
40
- end
41
-
42
- protected
43
-
44
- def get_fact(sexp)
45
- sexp[1]
46
- end
47
-
48
- end
49
- end