foreman-monit 1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +56 -0
- data/Rakefile +1 -0
- data/bin/foreman-monit +10 -0
- data/foreman-monit.gemspec +21 -0
- data/lib/foreman-monit/cli.rb +22 -0
- data/lib/foreman-monit/exporter.rb +72 -0
- data/lib/foreman-monit/version.rb +5 -0
- data/lib/foreman-monit.rb +10 -0
- data/templates/monitrc.erb +5 -0
- metadata +85 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a95b4eeaf37f24b3bb61e14806dfd0103e352c07
|
4
|
+
data.tar.gz: 7567d088c18b44c5b0ba13b1c75031da1c04615d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5821a7ee7e2b0b8933b6605e535be2cd44c2aa1d527d492f63e97818d7f0f8f9dfbadc4631ed17549dc5370d97efc9f5a82351da6f0922044fd2aa78e3ef448a
|
7
|
+
data.tar.gz: 7ffafa7c9f79bb280fa0f944220272000380f7f3f4dc21bde7f3883d4bd64f86f5375cf2978e6dc06fd82bbd0abb90c7067efed031eed3e2784793653b99ab8f
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Sebastian Georgi
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
# Foreman::Monit
|
2
|
+
|
3
|
+
Small command-line too to export from Procfile to monit control files
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'foreman-monit', github: 'capita/foreman-monit'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
## Usage
|
16
|
+
|
17
|
+
'foreman-monit export' outputs a monit control file for every process listed in the given Procfile. foreman-monit
|
18
|
+
has to be called from the projects root directory and outputs to /tmp/foreman-monit per default. It is most useful in deployment
|
19
|
+
via Capistrano to automate restarting of processes or changing the processes configuration/definition after or inside
|
20
|
+
your deployment routine
|
21
|
+
|
22
|
+
You have to provide --user, --env, [--chruby] and --app to specify the user that will be running the processes, the RAILS_ENV
|
23
|
+
to use an a general application-indentifier to name control files and groups accordingly.
|
24
|
+
|
25
|
+
Inside your procfile, you can use PORT, PID_FILE and RAILS_ENV in your process command, e.g.
|
26
|
+
|
27
|
+
web: bundle exec puma -p $PORT --pidfile $PID_FILE
|
28
|
+
worker: bundle exec rake resque:work PIDFILE=$PID_FILE
|
29
|
+
|
30
|
+
Monit will fork the command in a shell for the specified user and will redirect each output to ./<target>/<app>-<process>.log
|
31
|
+
|
32
|
+
Just include the directory ./monit/*.conf (or whatever you chose as a target) in your global monitrc and do a 'monit reload'
|
33
|
+
|
34
|
+
You can start or stop the app's jobs by issuing
|
35
|
+
|
36
|
+
monit -g <app> start
|
37
|
+
monit -g <app> stop
|
38
|
+
|
39
|
+
or
|
40
|
+
|
41
|
+
monit -g <app> restart
|
42
|
+
|
43
|
+
which will typically be somewhere in your 'cap:restart' definition in your Capfile ,e.g.
|
44
|
+
|
45
|
+
monit stop -g <app>
|
46
|
+
foreman-monit export --app <app> --user <user> --env production
|
47
|
+
monit reload
|
48
|
+
monit start -g <app>
|
49
|
+
|
50
|
+
## Contributing
|
51
|
+
|
52
|
+
1. Fork it
|
53
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
54
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
55
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
56
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/foreman-monit
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'foreman-monit/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "foreman-monit"
|
8
|
+
gem.version = Foreman::Monit::VERSION
|
9
|
+
gem.authors = ["Sebastian Georgi"]
|
10
|
+
gem.email = ["sgeorgi@capita.de"]
|
11
|
+
gem.description = %q{Outputs bash-wrapped launchers and control files for monit}
|
12
|
+
gem.summary = %q{...}
|
13
|
+
gem.homepage = ""
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.add_dependency('foreman')
|
17
|
+
gem.add_dependency('thor')
|
18
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
19
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
20
|
+
gem.require_paths = ["lib"]
|
21
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'thor/actions'
|
3
|
+
require 'rubygems/config_file'
|
4
|
+
|
5
|
+
Gem.configuration
|
6
|
+
|
7
|
+
module ForemanMonit
|
8
|
+
class CLI < Thor
|
9
|
+
include Thor::Actions
|
10
|
+
|
11
|
+
method_option 'app', :type => :string, :required => true
|
12
|
+
method_option 'user', :type => :string, :required => true
|
13
|
+
method_option 'target', :type => :string, :default => '/tmp/foreman-monit'
|
14
|
+
method_option 'env', :type => :string, :required => true
|
15
|
+
method_option 'chruby', :type => :string, :required => false
|
16
|
+
|
17
|
+
desc 'export', 'Exports shell-wrapper in ./bin and outputs a monit control file for each process in Procfile'
|
18
|
+
def export
|
19
|
+
ForemanMonit.export_to_monitrc(options.dup)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require "foreman/engine"
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module ForemanMonit
|
5
|
+
class Exporter
|
6
|
+
def initialize(options)
|
7
|
+
@app = options[:app]
|
8
|
+
@user = options[:user]
|
9
|
+
@target = options[:target]
|
10
|
+
@env = options[:env]
|
11
|
+
@chruby = options[:chruby]
|
12
|
+
|
13
|
+
@engine = Foreman::Engine.new
|
14
|
+
load_procfile
|
15
|
+
load_env
|
16
|
+
@port = @engine.base_port
|
17
|
+
end
|
18
|
+
|
19
|
+
def run!
|
20
|
+
Dir.mkdir(@target) unless File.exist?(@target)
|
21
|
+
FileUtils.rm Dir.glob("#{@target}/*.conf")
|
22
|
+
@engine.each_process do |name, process|
|
23
|
+
file_name = File.join(@target, "#{@app}-#{name}.conf")
|
24
|
+
File.open(file_name, 'w') { |f| f.write ERB.new(File.read(File.expand_path("../../../templates/monitrc.erb", __FILE__))).result(binding) }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def info
|
29
|
+
puts @engine.processes.inspect
|
30
|
+
end
|
31
|
+
|
32
|
+
def port
|
33
|
+
@port += 1
|
34
|
+
@port-1
|
35
|
+
end
|
36
|
+
|
37
|
+
def chruby_init
|
38
|
+
if @chruby
|
39
|
+
"chruby #{@chruby} &&"
|
40
|
+
else
|
41
|
+
''
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def base_dir
|
46
|
+
Dir.getwd
|
47
|
+
end
|
48
|
+
|
49
|
+
def pid_file(name)
|
50
|
+
File.expand_path(File.join(@target, "#{@app}-#{name}.pid"))
|
51
|
+
end
|
52
|
+
|
53
|
+
def log_file(name)
|
54
|
+
File.expand_path(File.join(@target, "#{@app}-#{name}.log"))
|
55
|
+
end
|
56
|
+
|
57
|
+
def rails_env
|
58
|
+
@env
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def load_env
|
64
|
+
default_env = File.join(@engine.root, ".env")
|
65
|
+
@engine.load_env default_env if File.exists?(default_env)
|
66
|
+
end
|
67
|
+
|
68
|
+
def load_procfile
|
69
|
+
@engine.load_procfile('Procfile')
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,5 @@
|
|
1
|
+
check process <%= @app %>-<%= name %> with pidfile <%= pid_file(name) %>
|
2
|
+
start program "`which su` <%= @user %> -l -c '<%= chruby_init %> cd <%= base_dir %>; export PORT=<%= port %>; export PID_FILE=<%= pid_file(name) %>; export RAILS_ENV=<%= rails_env %>; <%= process.command %> >> <%= log_file(name) %> 2>&1 &'" with timeout 180 seconds
|
3
|
+
stop program = "`which bash` -c 'kill -SIGKILL `cat <%= pid_file(name) %>` && rm <%= pid_file(name) %>'"
|
4
|
+
group <%= @app %>
|
5
|
+
|
metadata
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: foreman-monit
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '1.0'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sebastian Georgi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-09-22 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: foreman
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: thor
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: Outputs bash-wrapped launchers and control files for monit
|
42
|
+
email:
|
43
|
+
- sgeorgi@capita.de
|
44
|
+
executables:
|
45
|
+
- foreman-monit
|
46
|
+
extensions: []
|
47
|
+
extra_rdoc_files: []
|
48
|
+
files:
|
49
|
+
- .gitignore
|
50
|
+
- Gemfile
|
51
|
+
- LICENSE.txt
|
52
|
+
- README.md
|
53
|
+
- Rakefile
|
54
|
+
- bin/foreman-monit
|
55
|
+
- foreman-monit.gemspec
|
56
|
+
- lib/foreman-monit.rb
|
57
|
+
- lib/foreman-monit/cli.rb
|
58
|
+
- lib/foreman-monit/exporter.rb
|
59
|
+
- lib/foreman-monit/version.rb
|
60
|
+
- templates/monitrc.erb
|
61
|
+
homepage: ''
|
62
|
+
licenses: []
|
63
|
+
metadata: {}
|
64
|
+
post_install_message:
|
65
|
+
rdoc_options: []
|
66
|
+
require_paths:
|
67
|
+
- lib
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - '>='
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
requirements: []
|
79
|
+
rubyforge_project:
|
80
|
+
rubygems_version: 2.0.3
|
81
|
+
signing_key:
|
82
|
+
specification_version: 4
|
83
|
+
summary: '...'
|
84
|
+
test_files: []
|
85
|
+
has_rdoc:
|