qswarm 0.0.21 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|