qswarm 0.0.21 → 1.0.0
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.md +264 -1
- data/bin/qswarm +9 -6
- data/lib/qswarm.rb +17 -3
- data/lib/qswarm/agent.rb +160 -40
- data/lib/qswarm/connection.rb +25 -0
- data/lib/qswarm/connections/amqp.rb +167 -0
- data/lib/qswarm/connections/logger.rb +27 -0
- data/lib/qswarm/connections/twitter.rb +148 -0
- data/lib/qswarm/connections/xmpp.rb +92 -0
- data/lib/qswarm/dsl.rb +56 -12
- data/lib/qswarm/swarm.rb +5 -24
- data/lib/qswarm/version.rb +1 -1
- data/qswarm.gemspec +6 -2
- metadata +64 -23
- data/lib/qswarm/broker.rb +0 -118
- data/lib/qswarm/listener.rb +0 -99
- data/lib/qswarm/loggable.rb +0 -15
- data/lib/qswarm/speaker.rb +0 -76
- data/lib/qswarm/speakers/http.rb +0 -67
- data/lib/qswarm/speakers/irc.rb +0 -107
- data/lib/qswarm/speakers/mysql.rb +0 -39
- data/lib/qswarm/speakers/nc.rb +0 -41
data/lib/qswarm/loggable.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'logger'
|
2
|
-
require 'gelf'
|
3
|
-
|
4
|
-
module Qswarm
|
5
|
-
module Loggable
|
6
|
-
def logger
|
7
|
-
Loggable.logger
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.logger
|
11
|
-
# @logger ||= Logger.new(STDOUT)
|
12
|
-
@logger ||= GELF::Logger.new($graylog2_host, 12201, 'WAN', { :facility => $graylog2_facility })
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
data/lib/qswarm/speaker.rb
DELETED
@@ -1,76 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
require 'ostruct'
|
3
|
-
|
4
|
-
require 'qswarm/dsl'
|
5
|
-
|
6
|
-
module Qswarm
|
7
|
-
class Speaker
|
8
|
-
include Qswarm::Loggable
|
9
|
-
extend Qswarm::DSL
|
10
|
-
|
11
|
-
dsl_accessor :broker
|
12
|
-
attr_reader :agent, :metadata, :heard, :name
|
13
|
-
|
14
|
-
def initialize(listener, name, args, &block)
|
15
|
-
@listener = listener
|
16
|
-
@agent = @listener.agent
|
17
|
-
@name = name.to_s unless name.nil?
|
18
|
-
@block = block
|
19
|
-
@args = OpenStruct.new args
|
20
|
-
@bind = nil
|
21
|
-
end
|
22
|
-
|
23
|
-
def parse(metadata, payload)
|
24
|
-
@metadata = metadata
|
25
|
-
case @listener.format
|
26
|
-
when :json
|
27
|
-
@heard = JSON.parse(payload)
|
28
|
-
else
|
29
|
-
@heard = payload
|
30
|
-
end
|
31
|
-
|
32
|
-
self.instance_eval(&@block)
|
33
|
-
rescue JSON::ParserError
|
34
|
-
error = "JSON::ParserError on #{payload.inspect}"
|
35
|
-
logger.error error
|
36
|
-
# publish :errors, :text, "errors.#{@agent.name}.#{$fqdn}", error
|
37
|
-
end
|
38
|
-
|
39
|
-
def log(msg)
|
40
|
-
logger.info "[#{@agent.name}] #{msg}"
|
41
|
-
end
|
42
|
-
|
43
|
-
def inject(format = :text, msg)
|
44
|
-
routing_key = @bind || @name
|
45
|
-
logger.debug "[#{@agent.name}] Sending '#{msg}' to broker #{get_broker(@broker).name}/#{routing_key}"
|
46
|
-
publish @broker, format, routing_key, msg
|
47
|
-
log msg if format == :text
|
48
|
-
end
|
49
|
-
|
50
|
-
def get_broker(name)
|
51
|
-
@listener.get_broker(name)
|
52
|
-
end
|
53
|
-
|
54
|
-
def run
|
55
|
-
end
|
56
|
-
|
57
|
-
def arg(name)
|
58
|
-
@args[name]
|
59
|
-
end
|
60
|
-
|
61
|
-
def bind(routing_key)
|
62
|
-
@bind = routing_key
|
63
|
-
end
|
64
|
-
|
65
|
-
private
|
66
|
-
|
67
|
-
def publish(broker_name, format, routing_key, msg)
|
68
|
-
case format
|
69
|
-
when :json
|
70
|
-
get_broker(broker_name).exchange.publish JSON.generate(msg), :routing_key => routing_key
|
71
|
-
when :text
|
72
|
-
get_broker(broker_name).exchange.publish msg, :routing_key => routing_key
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
data/lib/qswarm/speakers/http.rb
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
require 'uri'
|
2
|
-
require 'em-http-request'
|
3
|
-
|
4
|
-
module Qswarm
|
5
|
-
module Speakers
|
6
|
-
class Http < Qswarm::Speaker
|
7
|
-
@@connections = {}
|
8
|
-
|
9
|
-
def initialize(listener, name, args, &block)
|
10
|
-
@uri = URI.parse(name)
|
11
|
-
@uri.host = 'localhost' if @uri.host.nil?
|
12
|
-
super
|
13
|
-
end
|
14
|
-
|
15
|
-
def inject(format = :text, msg)
|
16
|
-
publish format, msg
|
17
|
-
end
|
18
|
-
|
19
|
-
def run
|
20
|
-
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def auth?
|
25
|
-
|
26
|
-
end
|
27
|
-
|
28
|
-
def publish(format, msg)
|
29
|
-
logger.debug "Sending '#{msg}' to #{@name}"
|
30
|
-
head = @args.user.nil? ? {} : { 'authorization' => [@args.user, @args.password] }
|
31
|
-
|
32
|
-
case format
|
33
|
-
when :get
|
34
|
-
if msg.is_a? Hash
|
35
|
-
connection = EventMachine::HttpRequest.new(@uri)
|
36
|
-
http = connection.get :head => head, :query => msg
|
37
|
-
else
|
38
|
-
connection = EventMachine::HttpRequest.new(URI.join(@uri.to_s, msg))
|
39
|
-
http = connection.get :head => head
|
40
|
-
end
|
41
|
-
http.errback do
|
42
|
-
logger.error "Error sending #{msg} to #{@name}: #{http.error}/#{http.response_header.status} #{http.response}"
|
43
|
-
end
|
44
|
-
http.callback do
|
45
|
-
if @args.expect != http.response_header.status
|
46
|
-
logger.error "#{@uri.to_s} Unexpected response code: #{http.response_header.status} #{http.response}"
|
47
|
-
end
|
48
|
-
connection.close(nil)
|
49
|
-
end
|
50
|
-
|
51
|
-
when :post
|
52
|
-
connection = EventMachine::HttpRequest.new(@uri)
|
53
|
-
http = connection.post :head => head, :body => msg
|
54
|
-
http.errback do
|
55
|
-
logger.error "Error sending #{msg} to #{@name}: #{http.error}/#{http.response_header.status} #{http.response}"
|
56
|
-
end
|
57
|
-
http.callback do
|
58
|
-
if @args.expect != http.response_header.status
|
59
|
-
logger.error "#{@uri.to_s} Unexpected response code: #{http.response_header.status} #{http.response}"
|
60
|
-
end
|
61
|
-
connection.close(nil)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
data/lib/qswarm/speakers/irc.rb
DELETED
@@ -1,107 +0,0 @@
|
|
1
|
-
require 'cinch'
|
2
|
-
require 'ostruct'
|
3
|
-
|
4
|
-
module Qswarm
|
5
|
-
module Speakers
|
6
|
-
class Irc < Qswarm::Speaker
|
7
|
-
@@irc_servers = {}
|
8
|
-
|
9
|
-
def initialize(listener, name, args, &block)
|
10
|
-
@admin_host = args[:admin_host]
|
11
|
-
@channels = []
|
12
|
-
@connected = false
|
13
|
-
super
|
14
|
-
end
|
15
|
-
|
16
|
-
def inject(format = :text, msg)
|
17
|
-
if @connected
|
18
|
-
routing_key = @bind || @name
|
19
|
-
logger.debug "[#{@agent.name}] Sending '#{msg}' to channel #{routing_key}"
|
20
|
-
publish format, routing_key, msg
|
21
|
-
else
|
22
|
-
EventMachine::Timer.new(5,self.inject(format, msg))
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def run
|
27
|
-
@name.match(/([^#]*)(#.+)/) { irc_connect $1.empty? ? 'localhost' : $1, $2 }
|
28
|
-
end
|
29
|
-
|
30
|
-
def on_join(m)
|
31
|
-
unless m.user.nick == m.bot.nick
|
32
|
-
if @admin_host && Regexp.new(@admin_host).match(m.user.host)
|
33
|
-
m.channel.op(m.user)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def on_connect(m)
|
39
|
-
@connected = true
|
40
|
-
end
|
41
|
-
|
42
|
-
def on_disconnect(m)
|
43
|
-
@connected = false
|
44
|
-
end
|
45
|
-
|
46
|
-
private
|
47
|
-
|
48
|
-
def join(irc_server, channel)
|
49
|
-
if !@channels.include? channel
|
50
|
-
logger.debug "Joining channel #{channel}"
|
51
|
-
@@irc_servers[irc_server].channel_list.find_ensured(channel).join()
|
52
|
-
@channels << channel
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def irc_connect(irc_server, channel)
|
57
|
-
if bot = @@irc_servers[irc_server]
|
58
|
-
join irc_server, channel
|
59
|
-
else
|
60
|
-
logger.debug "Connecting to IRC server #{irc_server} channel #{channel}"
|
61
|
-
|
62
|
-
@@irc_servers[irc_server] = Cinch::Bot.new do
|
63
|
-
on :channel do |m|
|
64
|
-
if m.message =~ /^#{m.bot.nick}/
|
65
|
-
EM.defer do
|
66
|
-
m.bot.config.shared['speaker'].parse( OpenStruct.new( :routing_key => '__', :message => m, :channel => m.channel ), m.message )
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
on :join do |m|
|
72
|
-
m.bot.config.shared['speaker'].on_join(m)
|
73
|
-
end
|
74
|
-
|
75
|
-
on :connect do |m|
|
76
|
-
m.bot.config.shared['speaker'].on_connect(m)
|
77
|
-
end
|
78
|
-
|
79
|
-
on :disconnect do |m|
|
80
|
-
m.bot.config.shared['speaker'].on_disconnect(m)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
@@irc_servers[irc_server].config.server = irc_server
|
85
|
-
@@irc_servers[irc_server].config.nick = @agent.name
|
86
|
-
@@irc_servers[irc_server].config.channels << channel
|
87
|
-
@@irc_servers[irc_server].config.shared['speaker'] = self
|
88
|
-
|
89
|
-
@channels << channel
|
90
|
-
|
91
|
-
EM.defer do
|
92
|
-
@@irc_servers[irc_server].start
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
def publish(format, name, msg)
|
98
|
-
name.match(/([^#]*)(#.+)/) do
|
99
|
-
irc_server = $1.empty? ? 'localhost' : $1
|
100
|
-
join(irc_server, $2)
|
101
|
-
@@irc_servers[irc_server].channel_list.find($2).andand.send( format == :json ? JSON.generate(msg) : msg )
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
# require 'mysql2'
|
2
|
-
|
3
|
-
module Qswarm
|
4
|
-
module Speakers
|
5
|
-
class Mysql < Qswarm::Speaker
|
6
|
-
@@db_servers = {}
|
7
|
-
|
8
|
-
def inject(format = :text, msg)
|
9
|
-
logger.debug "[#{@agent.name}] Sending '#{msg}' to channel #{@name}"
|
10
|
-
publish format, @name, msg
|
11
|
-
end
|
12
|
-
|
13
|
-
def run
|
14
|
-
@name.match(/([^#]*)(#.+)/) { db_connect $1.empty? ? 'localhost' : $1, $2 }
|
15
|
-
end
|
16
|
-
|
17
|
-
private
|
18
|
-
|
19
|
-
def db_connect(db_server, database)
|
20
|
-
if connection = @@db_servers[db_server]
|
21
|
-
logger.debug "Connecting to database #{database}"
|
22
|
-
else
|
23
|
-
logger.debug "Connecting to DB server #{db_server} database #{database}"
|
24
|
-
@@db_servers[db_server] = 'foo'
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def publish(format, name, msg)
|
29
|
-
@name.match(/([^#]*)(#.+)/) do
|
30
|
-
logger.debug "#{$1} #{$2} #{msg}"
|
31
|
-
# @@db_servers[$1.empty? ? 'localhost' : $1].channel_manager.find_ensured($2).andand.send(
|
32
|
-
# format == :json ? JSON.generate(msg) : msg
|
33
|
-
# )
|
34
|
-
# end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
data/lib/qswarm/speakers/nc.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
module Qswarm
|
2
|
-
module Speakers
|
3
|
-
class Nc < Qswarm::Speaker
|
4
|
-
@@connections = {}
|
5
|
-
|
6
|
-
def inject(format = :text, msg)
|
7
|
-
publish format, msg
|
8
|
-
end
|
9
|
-
|
10
|
-
def run
|
11
|
-
@name.match(/([^#]*):(\d+)/) do
|
12
|
-
@host = $1.empty? ? 'localhost' : $1
|
13
|
-
@port = $2
|
14
|
-
@server = @host + ':' + @port
|
15
|
-
# @service = $3
|
16
|
-
end
|
17
|
-
connect
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
def connect
|
23
|
-
if connection = @@connections[@server]
|
24
|
-
logger.debug "Connecting to service #{@service}"
|
25
|
-
else
|
26
|
-
logger.debug "Connecting to host #{@server} service #{@service}"
|
27
|
-
@@connections[@server] = EventMachine::connect @host, @port do |connection|
|
28
|
-
def connection.receive_data(data)
|
29
|
-
puts "Received #{data} from #{@name}"
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def publish(format, msg)
|
36
|
-
logger.debug "Sending '#{msg}' to #{@name}"
|
37
|
-
@@connections[@server].send_data( (format == :json ? JSON.generate(msg) : msg) + "\n")
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|