gerouter 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+ vendor/bundle
15
+
16
+ # YARD artifacts
17
+ .yardoc
18
+ _yardoc
19
+ doc/
20
+
21
+ wiki/
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,30 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ gerouter (0.0.1)
5
+ amqp
6
+ em-ssh
7
+ eventmachine
8
+
9
+ GEM
10
+ remote: http://rubygems.org/
11
+ specs:
12
+ amq-client (0.9.11)
13
+ amq-protocol (>= 1.0.1)
14
+ eventmachine
15
+ amq-protocol (1.2.0)
16
+ amqp (0.9.8)
17
+ amq-client (~> 0.9.5)
18
+ amq-protocol (>= 0.9.4)
19
+ eventmachine
20
+ em-ssh (0.4.3)
21
+ eventmachine
22
+ net-ssh
23
+ eventmachine (1.0.0)
24
+ net-ssh (2.6.5)
25
+
26
+ PLATFORMS
27
+ ruby
28
+
29
+ DEPENDENCIES
30
+ gerouter!
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2013 rinrinne a.k.a. rin_ne
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,127 @@
1
+ gerouter: Gerrit Event Router
2
+ ===========================
3
+
4
+ * Author: rinrinne
5
+ * Repository: https://github.com/rinrinne/gerrit-event-router
6
+
7
+ Synopsis
8
+ ---------------------------
9
+
10
+ gerouter is a server application for routing [Gerrit][gerrit] events to message broker.
11
+ Now only AMQP broker is supported (recommend [RabbitMQ][rabbitmq] as message queue server)
12
+
13
+ Motivation
14
+ ---------------------------
15
+
16
+ Gerrit provides events via ssh stream. Client can receive them using ssh connection. But both of them has no dedicated queue. It means that client may miss many events if ssh is disconnected.
17
+
18
+ Gerrit events are not required to be processed in real-time. So we can improve this by using asynchronous communication protocol.
19
+
20
+ This application can achieve this purpose by a combination with message queue service.
21
+
22
+
23
+ Usage
24
+ --------------------------
25
+
26
+ Install gem:
27
+
28
+ ```console
29
+ $ gem install gerouter
30
+ ```
31
+
32
+ Install from repository:
33
+
34
+ ```console
35
+ $ rake build
36
+ $ bundle install
37
+ ```
38
+
39
+ Command help:
40
+
41
+ ```console
42
+ $ bundle exec gerouter --help
43
+ Usage: gerouter [options]
44
+ -d, --debug Debug mode
45
+ -c, --config CONFIGFILE Path to config file
46
+ -n, --name NAME Name of gerrit
47
+ ```
48
+
49
+ You should specify -c and -n options.
50
+
51
+ ```console
52
+ $ bundle exec gerouter -c gerouter.conf -n foobar
53
+ ```
54
+
55
+ If -n is not specified, gerouter displays name list.
56
+
57
+ ```console
58
+ $ bundle exec gerouter -c gerouer.conf
59
+ ---
60
+ :gerrit:
61
+ - foobar
62
+ :broker:
63
+ - foo
64
+ ```
65
+
66
+ This application has user process and runs in foreground. If you want to run as daemon, recommend to use [God][god]. Samples are stored in [here][samples].
67
+
68
+ Note that sample is configured to use [shared rbenv][sharedrbenv]
69
+
70
+ Config
71
+ ---------------------------
72
+
73
+ Sample of config is also stored in [here][samples].
74
+
75
+ * YAML format with object information
76
+ * gerrit and broker items
77
+ * You can add any number of them
78
+ * `broker` in gerrit has the broker name
79
+ * gerrits can share one broker
80
+
81
+
82
+ Stuffed Gerrit event
83
+ ---------------------------
84
+
85
+ As below, gerouter stuffs Gerrit event with own object then send to broker.
86
+
87
+ ```json
88
+ {
89
+ "provider":"gerouter",
90
+ "version":"1",
91
+ "host":"gerrit hostname",
92
+ "event":{"ORIGINAL EVENT"}
93
+ }
94
+ ```
95
+
96
+ If you want to treat raw Gerrit event, you should set "raw" to `mode` in broker config.
97
+
98
+ Notice
99
+ ---------------------------
100
+
101
+ This application generates only exchange on message queue service. No any queues/bindings are generated. It should be consumer's responsible.
102
+
103
+ Material
104
+ --------------------------
105
+
106
+ * [Gerrit Code Review][gerrit]
107
+ * [RabbitMQ][rabbitmq]
108
+ * [Message queue][messagequeue]
109
+ * [God][god]
110
+ * [install-shared-rbenv][sharedrbenv]
111
+
112
+ [gerrit]: https://code.google.com/p/gerrit/ "Gerrit Code Review"
113
+ [rabbitmq]: http://www.rabbitmq.com/ "RabbitMQ"
114
+ [god]: http://godrb.com/ "God"
115
+ [samples]: https://github.com/rinrinne/gerrit-event-router/tree/master/samples "samples"
116
+ [sharedrbenv]: https://github.com/rinrinne/install-shared-rbenv "Install shared rbenv"
117
+ [messagequeue]: http://en.wikipedia.org/wiki/Message_queue "Wikipedia: Message queue"
118
+
119
+ License
120
+ ---------------------------
121
+
122
+ MIT License
123
+
124
+ Copyright
125
+ ---------------------------
126
+
127
+ Copyright (c) 2013 rinrinne a.k.a. rin_ne
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/gerouter ADDED
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+
4
+ require 'rubygems'
5
+ require 'bundler/setup'
6
+ require 'optparse'
7
+ require 'eventmachine'
8
+ require 'em-ssh'
9
+ require 'amqp'
10
+ require 'ger'
11
+
12
+ Version = GER::VERSION
13
+ GER.logger(GER::LOG_NORMAL).progname = GER::NAME
14
+ STDOUT.sync = true
15
+
16
+ begin
17
+ OPTS = {}
18
+ OptionParser.new do |opt|
19
+ opt.on('-d', '--debug', "Debug mode") do
20
+ OPTS[:debug] = true
21
+ end
22
+ opt.on('-c CONFIGFILE', '--config', 'Path to config file') do |v|
23
+ OPTS[:config] = v
24
+ end
25
+ opt.on('-n NAME', '--name', 'Name of gerrit') do |v|
26
+ OPTS[:name] = v
27
+ end
28
+ opt.parse(ARGV)
29
+ end
30
+
31
+ GER.logger.level = GER::LOG_DEBUG if OPTS[:debug]
32
+
33
+ conf = GER.load_config(OPTS[:config]||"#{GER::CONFIG_NAME}")
34
+
35
+ if OPTS[:name]
36
+ GER.start(OPTS[:name], conf)
37
+ else
38
+ STDOUT.puts conf.names
39
+ end
40
+
41
+ rescue => e
42
+ GER.logger.error("#{e.message} (#{e.class})")
43
+ GER.logger.debug("TRACE -->\nT, #{e.backtrace.join("\nT, ")}")
44
+ exit 1
45
+ end
data/gerouter.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'ger/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "gerouter"
8
+ gem.version = GerritEventRouter::VERSION
9
+ gem.authors = ["rinrinne"]
10
+ gem.email = ["rinrin.ne@gmail.com"]
11
+ gem.description = %q{Server application for routing gerrit events to message broker}
12
+ gem.summary = %q{Gerrit Event Router}
13
+ gem.homepage = "https://github.com/rinrinne/gerrit-event-router/"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_runtime_dependency("eventmachine")
21
+ gem.add_runtime_dependency("em-ssh")
22
+ gem.add_runtime_dependency("amqp")
23
+ end
@@ -0,0 +1,107 @@
1
+ # -*- coding: utf-8 -*-
2
+ module GerritEventRouter
3
+ module Broker
4
+ class AMQP < Base
5
+ HEADER = '[Broker::AMQP]'
6
+
7
+ class Config < GerritEventRouter::Broker::Config::Base
8
+ def initialize(name, uri, mode, user, exchange)
9
+ super(name, uri, mode)
10
+ @user = user
11
+ @exchange = exchange
12
+ end
13
+
14
+ def header
15
+ AMQP::HEADER
16
+ end
17
+
18
+ attr_reader :user, :exchange
19
+ end
20
+
21
+ def initialize(broker)
22
+ super(broker)
23
+ @headers = {
24
+ :content_type => 'application/json',
25
+ :user_id => @broker.user,
26
+ :app_id => GER::NAME
27
+ }
28
+ @connection = nil
29
+ @exchange = nil
30
+ end
31
+
32
+ def connect(&block)
33
+ begin
34
+ @connection = ::AMQP.connect(@broker.uri) do |connection|
35
+ generate_channel(connection)
36
+ block.call self if block
37
+ end
38
+
39
+ @connection.on_tcp_connection_loss(&method(:conn_loss))
40
+ @connection.on_connection_interruption(&method(:conn_intp))
41
+ @connection.on_recovery(&method(:generate_channel))
42
+
43
+ self
44
+ rescue ::AMQP::PossibleAuthenticationFailureError => afe
45
+ auth_failure(afe)
46
+ rescue ::AMQP::TCPConnectionFailed => e
47
+ conn_failure(e)
48
+ end
49
+ end
50
+
51
+ def send(data, param)
52
+ param[:timestamp] = Time.now.to_i
53
+ @exchange.publish(data, @headers.merge(param)) do
54
+ GER.logger.info "#{HEADER} Published time: #{param[:timestamp]}, routing: #{param[:routing_key]||'All'}"
55
+ GER.logger.debug "#{HEADER} Published content: #{data}"
56
+ end
57
+ end
58
+
59
+ def channel
60
+ if @exchange then
61
+ @exchange.channel
62
+ else
63
+ nil
64
+ end
65
+ end
66
+
67
+ def generate_channel(connection = nil)
68
+ conn = connection || @connection
69
+ channel = ::AMQP::Channel.new(conn, ::AMQP::Channel.next_channel_id)
70
+ channel.auto_recovery = true
71
+ channel.on_error do |ch, channel_close|
72
+ raise channel_close.reply_text
73
+ end
74
+
75
+ @exchange = ::AMQP::Exchange.new(channel,
76
+ @broker.exchange['type'].to_sym,
77
+ @broker.exchange['name'])
78
+ end
79
+
80
+ def conn_failure(err)
81
+ GER.logger.error "#{HEADER} TCP connection failed, as expcted."
82
+ EM.stop if EM.reactor_running?
83
+ end
84
+
85
+ def auth_failure(err)
86
+ GER.logger.error "#{HEADER} Authentication failed, as expcted, caught #{afe.inspect}"
87
+ EM.stop if EM.reactor_running?
88
+ end
89
+
90
+ def conn_loss(connection, settings)
91
+ if connection.error? then
92
+ GER.logger.warn "#{HEADER} Connection lost. reconnectiong..."
93
+ connection.reconnect(false, 1)
94
+ end
95
+ end
96
+
97
+ def conn_intp(connection)
98
+ if connection.error? then
99
+ GER.logger.warn "#{HEADER} Connection interrupton. reconnectiong..."
100
+ connection.reconnect(false, 1)
101
+ end
102
+ end
103
+
104
+ attr_reader :connection, :exchange
105
+ end
106
+ end
107
+ end
data/lib/ger/broker.rb ADDED
@@ -0,0 +1,38 @@
1
+ # -*- coding: utf-8 -*-
2
+ module GerritEventRouter
3
+ module Broker
4
+ class Base
5
+ HEADER = '[Broker::Base]'
6
+ def initialize(broker)
7
+ @broker = broker
8
+ end
9
+
10
+ def send(data)
11
+ end
12
+
13
+ def header
14
+ HEADER
15
+ end
16
+
17
+ end
18
+
19
+ module Config
20
+ class Base < GerritEventRouter::Config::Base
21
+ def initialize(name, uri, mode)
22
+ super(name, uri)
23
+ @mode = mode || "normal"
24
+ end
25
+
26
+ attr_reader :mode
27
+ end
28
+ end
29
+
30
+ class << self
31
+ def connect(broker, &block)
32
+ if broker.instance_of?(GER::Broker::AMQP::Config) then
33
+ GER::Broker::AMQP.new(broker).connect(&block)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
data/lib/ger/config.rb ADDED
@@ -0,0 +1,60 @@
1
+ # -*- coding: utf-8 -*-
2
+ module GerritEventRouter
3
+ class Config
4
+ class Array < ::Array
5
+ def [](key)
6
+ unless key.kind_of?(Integer)
7
+ self.each do |item|
8
+ if item.name == key then
9
+ return item
10
+ end
11
+ end
12
+ nil
13
+ else
14
+ super(key)
15
+ end
16
+ end
17
+ end
18
+
19
+ class Base
20
+ def initiallize(name, uri)
21
+ @name = name
22
+ @uri = uri.gsiub(%r|/+$|, "")
23
+ end
24
+
25
+ attr_reader :name, :uri
26
+ end
27
+
28
+ def initialize
29
+ @gerrits = Array.new
30
+ @brokers = Array.new
31
+ end
32
+
33
+ def load(path)
34
+ open(path) do |stream|
35
+ YAML.load_stream(stream, path) do |obj|
36
+ if obj.instance_of?(GER::Gerrit::Config)
37
+ @gerrits << obj
38
+ elsif obj.kind_of?(GER::Broker::Config::Base)
39
+ @brokers << obj
40
+ end
41
+ end
42
+ end
43
+ self
44
+ end
45
+
46
+ def names(to_yaml = true)
47
+ h = Hash.new
48
+ h[:gerrit] = @gerrits.map {|item| item.name}
49
+ h[:broker] = @brokers.map {|item| item.name}
50
+ if to_yaml then
51
+ YAML.dump(h)
52
+ else
53
+ h
54
+ end
55
+ end
56
+
57
+ attr_accessor :gerrits, :brokers
58
+ end
59
+ end
60
+
@@ -0,0 +1,9 @@
1
+ # -*- coding: utf-8 -*-
2
+ module GerritEventRouter
3
+ NAME = 'GEROUTER'
4
+ CONFIG_NAME = 'gerouter.conf'
5
+ LOG_NORMAL = ::Logger::INFO
6
+ LOG_DEBUG = ::Logger::DEBUG
7
+
8
+ SCHEMA_VERSION = '1'
9
+ end
data/lib/ger/gerrit.rb ADDED
@@ -0,0 +1,40 @@
1
+ # -*- coding: utf-8 -*-
2
+ module GerritEventRouter
3
+ class Gerrit
4
+ HEADER = '[gerrit]'
5
+
6
+ class Config < GerritEventRouter::Config::Base
7
+ DEFAULT_PORT = 29418
8
+ COMMAND = 'gerrit stream-events'
9
+
10
+ def initialize(name, uri, ssh_keys, broker, routing_key)
11
+ super(name, uri)
12
+ if ssh_keys.kind_of? Array then
13
+ @ssh_keys = ssh_keys
14
+ elsif ssh_keys.kind_of? String then
15
+ @ssh_keys= [ ssh_keys ]
16
+ end
17
+ @broker = broker
18
+ @routing_key = routing_key
19
+ end
20
+
21
+ def default_port
22
+ DEFAULT_PORT
23
+ end
24
+
25
+ def command
26
+ COMMAND
27
+ end
28
+
29
+ def header
30
+ Gerrit::HEADER
31
+ end
32
+
33
+ attr_reader :ssh_keys, :broker, :routing_key
34
+ end
35
+
36
+ def initialize(gerrit)
37
+ @gerrit = gerrit
38
+ end
39
+ end
40
+ end
data/lib/ger/router.rb ADDED
@@ -0,0 +1,83 @@
1
+ # -*- coding: utf-8 -*-
2
+ module GerritEventRouter
3
+ class Router
4
+ def initialize(name, config)
5
+ @name = name
6
+ begin
7
+ @gerrit = config.gerrits[name]
8
+ raise "Gerrit name is not found: #{name}" unless @gerrit
9
+ @broker = config.brokers[@gerrit.broker]
10
+ raise "Broker name is not found: #{@gerrit.broker}" unless @broker
11
+
12
+ GER.logger.info "Configured router: #{@gerrit.header}(#{@gerrit.name}) -> broker#{@broker.header}(#{@broker.name})"
13
+ @configured = true
14
+ rescue
15
+ @configured = false
16
+ raise
17
+ end
18
+ end
19
+
20
+ def start
21
+ raise "Router still not be configured" unless @configured
22
+
23
+ Signal.trap(:INT) do
24
+ GER.logger.info "Receive signal: INT. terminating."
25
+ EM.stop
26
+ end
27
+
28
+ Signal.trap(:TERM) do
29
+ GER.logger.info "Receive signal: TERM. terminating."
30
+ EM.stop
31
+ end
32
+
33
+ Signal.trap(:USR2) do
34
+ GER.logger.debug "Receive signal: USR2"
35
+ if GER.logger.level == GER::LOG_NORMAL then
36
+ GER.logger.level = GER::LOG_DEBUG
37
+ else
38
+ GER.logger.level = GER::LOG_NORMAL
39
+ end
40
+ end
41
+
42
+ begin
43
+ uri = URI.parse(@gerrit.uri)
44
+ uri.port = @gerrit.default_port unless uri.port
45
+ ssh_options = { :port => uri.port }
46
+ ssh_options[:keys] = @gerrit.ssh_keys if @gerrit.ssh_keys
47
+
48
+ EM.run do
49
+ EM::Ssh.start(uri.host, uri.user, ssh_options) do |connection|
50
+ connection.errback do |err|
51
+ GER.logger.error { "#{@gerrit.header} #{err} (#{err.class})" }
52
+ EM.stop
53
+ end
54
+
55
+ connection.callback do |session|
56
+ GER.logger.info("#{@gerrit.header} connection established.")
57
+
58
+ GER::Broker.connect(@broker) do |broker|
59
+ GER.logger.info("#{@broker.header} connection established.")
60
+ GER.logger.debug("#{@broker.header} channel id = #{broker.channel.id}")
61
+
62
+ session.exec(@gerrit.command) do |channel, stream, data|
63
+ channel.on_data do |ch, data|
64
+ if @broker.mode == "raw" then
65
+ str = %Q(#{data.strip})
66
+ else
67
+ str = %Q({"provider":"#{GER::NAME.downcase}","version":"#{GER::SCHEMA_VERSION}","host":"#{uri.host}","event":#{data.strip}})
68
+ end
69
+ broker.send(str, :routing_key => @gerrit.routing_key)
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ rescue => e
77
+ GER.logger.error { "#{e} (#{e.class})" }
78
+ GER.logger.debug { e.backtrace.join("\n") }
79
+ EM.stop
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,4 @@
1
+ # -*- coding: utf-8 -*-
2
+ module GerritEventRouter
3
+ VERSION = "0.0.2"
4
+ end
data/lib/ger.rb ADDED
@@ -0,0 +1,32 @@
1
+ # -*- coding: utf-8 -*-
2
+ $:.unshift File.dirname(File.expand_path(__FILE__))
3
+
4
+ require 'logger'
5
+ require 'yaml'
6
+ require 'uri'
7
+ require 'ger/constants'
8
+ require 'ger/config'
9
+ require 'ger/router'
10
+ require 'ger/gerrit'
11
+ require 'ger/broker'
12
+ require 'ger/broker/amqp'
13
+
14
+ module GerritEventRouter
15
+ class << self
16
+ attr_writer :logger
17
+ def logger(level = ::Logger::INFO)
18
+ @logger ||= ::Logger.new(STDOUT).tap {|l| l.level = level }
19
+ end
20
+
21
+ def load_config(path)
22
+ Config.new.load(path)
23
+ end
24
+
25
+ def start(name, config)
26
+ router = Router.new(name, config)
27
+ router.start
28
+ end
29
+ end
30
+ end
31
+
32
+ GER = GerritEventRouter
@@ -0,0 +1,17 @@
1
+ --- !ruby/object:GER::Gerrit::Config
2
+ name: gerrit
3
+ uri: ssh://user@localhost:29418
4
+ ssh_keys:
5
+ - /home/user/.ssh/id_dsa
6
+ - /home/user/.ssh/id_rsa
7
+ broker: amqp-jenkins
8
+ routing_key: gerrit.event.localhost
9
+
10
+ --- !ruby/object:GER::Broker::AMQP::Config
11
+ name: amqp-jenkins
12
+ uri: amqp://localhost # amqp / amqps
13
+ mode:
14
+ user:
15
+ exchange:
16
+ type: topic # direct / fanout /topic
17
+ name: gerrit.event
@@ -0,0 +1,3 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ God.load /etc/god/god.conf.d/*.god
@@ -0,0 +1,21 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'ger'
3
+
4
+ RBENV_ROOT = "/home/user/.rbenv"
5
+ RBENV_VER = "1.9.3-p385"
6
+ CONFIG = "/etc/gerouter/gerouter.conf"
7
+ LOG_DIR = "/ver/log/#{GER::NAME}"
8
+
9
+ conf = GER.load_config("#{CONFIG}")
10
+
11
+ conf.gerrits.each do |gerrit|
12
+ God.watch do |w|
13
+ w.name = gerrit.name
14
+ w.group = "gerouters"
15
+ w.log = "#{LOG_DIR}/#{gerrit.name}.log"
16
+ w.env = { 'RBENV_ROOT' => "#{RBENV_ROOT}",
17
+ 'RBENV_VERSION' => "#{RBENV_VER}" }
18
+ w.start = "#{RBENV_ROOT}/bin/rbenv exec gerouter -c #{CONFIG} -n #{gerrit.name}"
19
+ w.keepalive
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ description "Process Monitoring by God"
2
+ author "rinrinne <rinrin.ne@gmail.com>"
3
+
4
+ start on runlevel [2345]
5
+ stop on runlevel [!2345]
6
+
7
+ respawn
8
+ respawn limit 5 10
9
+
10
+ pre-start script
11
+ mkdir -p /var/run/god
12
+ mkdir -p /var/log/gerouter
13
+ end script
14
+
15
+ script
16
+ export RBENV_ROOT="/usr/local/rbenv"
17
+ export RBENV_VERSION="1.9.3-p385"
18
+ exec /usr/local/rbenv/bin/rbenv exec god -D -c /etc/god/god.conf
19
+ end script
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gerouter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - rinrinne
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-02-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: eventmachine
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: em-ssh
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: amqp
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: Server application for routing gerrit events to message broker
63
+ email:
64
+ - rinrin.ne@gmail.com
65
+ executables:
66
+ - gerouter
67
+ extensions: []
68
+ extra_rdoc_files: []
69
+ files:
70
+ - .gitignore
71
+ - Gemfile
72
+ - Gemfile.lock
73
+ - LICENSE.txt
74
+ - README.md
75
+ - Rakefile
76
+ - bin/gerouter
77
+ - gerouter.gemspec
78
+ - lib/ger.rb
79
+ - lib/ger/broker.rb
80
+ - lib/ger/broker/amqp.rb
81
+ - lib/ger/config.rb
82
+ - lib/ger/constants.rb
83
+ - lib/ger/gerrit.rb
84
+ - lib/ger/router.rb
85
+ - lib/ger/version.rb
86
+ - samples/gerouter.conf
87
+ - samples/god/god.conf
88
+ - samples/god/god.conf.d/gerouter.god
89
+ - samples/upstart/god.conf
90
+ homepage: https://github.com/rinrinne/gerrit-event-router/
91
+ licenses: []
92
+ post_install_message:
93
+ rdoc_options: []
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ none: false
104
+ requirements:
105
+ - - ! '>='
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ requirements: []
109
+ rubyforge_project:
110
+ rubygems_version: 1.8.23
111
+ signing_key:
112
+ specification_version: 3
113
+ summary: Gerrit Event Router
114
+ test_files: []
115
+ has_rdoc: